一.三种实例化Bean的方式

1.使用类构造器实例化(默认无参数)

<bean id="bean1" class="com.demo1.Bean1"></bean>

2.使用静态工厂方法实例化(简单工厂模式)静态方法

<bean id="bean2" class="com.demo2.Bean2Factory" factory-method="getBean2"></bean>

<!--需要创建一个UserFactroy类-->
public class Bean2Factory{
public static Bean2 getBean2(){
return new Bean2();
}}

3.使用实例工厂方法实例化(工厂方法模式)非静态方法

<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
<bean id="bean3Factory" class="com.demo2.Bean3Factory"/>
public class Bean3Factory{
public Bean3 getBean3(){
return new Bean3();
}
}

在applicationContext.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!-- bean对象创建
1.无参构造
-->
<bean name="user" class="com.bean.User"> </bean> <bean name="address" class="com.bean.Address">
</bean>
<!-- bean对象创建
2.静态工厂方法(不常用)
-->
<bean name="user1" class="com.bean.UserFactory" factory-method="createUser">
</bean>
<!-- bean对象创建
3.工厂方法L:非静态(不常用)
-->
<bean name="user2" factory-method="createUser1" factory-bean="factorybean"> </bean>
<bean name="factorybean" class="com.bean.UserFactory">
</bean>
</beans>

如果要使用工厂方法配置bean,而后要配置一个UserFactory.java对象

package com.bean;

/**
* Created by jiatp
*/
public class UserFactory {
public static User createUser(){
System.out.println("静态方法创建");
return new User();
} public User createUser1(){
System.out.println("非静态方法");
return new User();
}
}

Bean的命名,id属性和name属性:

一般情况下,装配一个Bean时,通过指定一个id属性作为Bean的名称

id 属性在IoC容器中必须是唯一

id 的命名要满足XML对ID属性命名规范

必须以字母开始,可以使用字母、数字、连字符、下划线、冒号

如果Bean的名称中含有特殊字符,就需要使用name属性

例如:

 <bean name="#person" class="com.bean.Person"/>

因为name属性可以相同,所以后出现Bean会覆盖之前出现的同名的Bean

Bean的作用域:

scope属性 :

* singleton:单例的.(默认的值.)

* prototype:多例的.

* request:web开发中.创建了一个对象,将这个对象存入request范围,request.setAttribute();

* session:web开发中.创建了一个对象,将这个对象存入session范围,session.setAttribute();

* globalSession:一般用于Porlet应用环境.指的是分布式开发.不是porlet环境,globalSession等同于session;

实际开发中主要使用singleton,prototype

<bean id="customer" class="com.demo3.Customer" scope="prototype"></bean>

Spring容器中Bean的生命周期:

1.instantiate bean对象实例化

2.populate properties 封装属性

3.如果Bean实现BeanNameAware 执行 setBeanName

4.如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext

5.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization

6.如果Bean实现InitializingBean 执行 afterPropertiesSet

7.调用<bean init-method="init"> 指定初始化方法 init

8.如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization

9.执行业务处理

10.如果Bean实现 DisposableBean 执行 destroy

11.调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy

二.依赖注入Bean的属性

代码实现:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!-- 对象注入 -->
<!--
1) set方式注入
基本数据类型 : (8种)
引用数据类型 : 包含类类型的属性
-->
<bean name="user" class="com.bean.User">
<property name="name" value="tom"></property>
<property name="age" value="18"></property>
<property name="address" ref="address"></property>
</bean>
<bean name="address" class="com.bean.Address">
<property name="city" value="北京"></property>
<property name="street" value="王府井"></property>
</bean>
<!--
2)构造方法注入
-->
<bean name="user1" class="com.bean.User">
<!-- constructor-arg
name属性:参数的名称
value属性:参数的值
ref属性:引用的bean对象
index属性:说明参数位置 index="0"
type属性: 参数的类型 type="java.lang.String"
-->
<constructor-arg name="name" value="abc" type="java.lang.String"></constructor-arg>
<constructor-arg name="age" value="20" type="java.lang.Integer"></constructor-arg>
<constructor-arg name="address" ref="address"></constructor-arg>
</bean>
<!--
3) p名称注入(了解)
-->
<bean name="user3" class="com.bean.User"
p:name="张三" p:age="10" p:address-ref="address">
</bean>
<!--
4) spel 注入 spring Expression language string 表达式语言
-->
<bean name="user4" class="com.bean.User">
<property name="name" value="#{user.name}"></property>
<property name="age" value="#{user3.age}"></property>
<property name="address" ref="address"></property>
</bean>
</beans>

1) set方式注入 :

        基本数据类型  :  (8种) 

        引用数据类型 :  包含类类型的属性

使用set方法注入,在Spring配置文件中,通过<property>设置注入的属性,<property>标签中name就是属性名称,value是普通属性的值,ref:引用其他的对象,(ref中可引入其它bean名称)

2)构造方法注入 :

<constructor-arg name="name" value="李四" type="java.lang.String"></constructor-arg>

name属性:参数的名称  

             value属性:参数的值  

             ref属性:引用的bean对象 

             index属性:说明参数位置  index="0"

             type属性: 参数的类型   type="java.lang.String"

3) p名称注入

使用p命名空间

为了简化XML文件配置,Spring从2.5开始引入一个新的p名称空间

p:<属性名>="xxx" 引入常量值

p:<属性名>-ref="xxx" 引用其它Bean对象

引入名称空间:xmlns:p="http://www.springframework.org/schema/p"

        <bean name="user2" class="com.bean.User" p:name="p注入" p:age="12" p:address-ref="addresss">

4) SpEL 注入 spring Expression language string 表达式语言

语法:#{表达式}

<bean id="" value="#{表达式}">

<SpEL表达式语言

语法:#{}

#{'神回复:哈哈'}使用字符串

#{topicId3} 使用另一个bean

#{topicId4.content.toUpperCase()} 使用指定名属性,并使用方法

#{T(java.lang.Math).PI} 使用静态字段或方法

依赖注入:

应用:三层结构(控制层-业务层-数据层)

控制层依赖业务层(在控制层类中注入业务层对象)

业务层依赖数据层(在业务层类中注入数据层对象)

注入:

1.注入<constructor-arg>  成员变量赋值通过构造

2.注入<property>  成员变量赋值通过set方法

三.集合类型属性的注入

1.新建CollectionBean.java

package com.collection;

import java.util.*;

/**
* Created by jiatp
*/
public class CollectionBean {
private Object[] arr;//数组注入
private List list;//list注入
private Map map;//map注入
private Properties prop;//properties注入
private Set<String> sets;//set注入 public Object[] getArr() {
return arr;
} public void setArr(Object[] arr) {
this.arr = arr;
} public List getList() {
return list;
} public void setList(List list) {
this.list = list;
} public Map getMap() {
return map;
} public void setMap(Map map) {
this.map = map;
} public Properties getProp() {
return prop;
} public void setProp(Properties prop) {
this.prop = prop;
} @Override
public String toString() {
return "CollectionBean{" + "arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", prop=" + prop + ", set=" + sets + '}';
}
}

applicationContext.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<bean name="user" class="com.icss.bean.User">
<property name="name" value="李四"/>
</bean>
<!--1.数组注入-->
<bean name="cb" class="com.collection.CollectionBean">
<property name="arr">
<array>
<value>tom</value>
<value>jack</value>
<ref bean="user"/>
</array>
</property>
<!--2.list注入-->
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
</list>
</property>
<!--3.map注入-->
<property name="map">
<map>
<entry key="url" value="jdbc:mysql://crm"/>
<entry key="user" value-ref="user"/>
</map>
</property>
<!--4.set注入-->
<property name="sets">
<set>
<value>zhansan</value>
<value>lisi</value>
</set>
</property>
<!--5.properties注入-->
<property name="prop">
<props>
<prop key="driverclass" >com.jdbc.mysql.Driver</prop>
<prop key="url" >jdbc:mysql:///crm</prop>
<prop key="username" >root</prop>
<prop key="password" >123456</prop>
</props>
</property>
</bean>
</beans>

使用多个xml配置文件

方式一 可以在创建ApplicationContext对象时传入多个配置文件

  ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml");

方式二 可以在配置文件中通过<import>引入其他配置文件

import resource="classpath:bean2.xml"/>

02_Spring Bean的装配模式_基于XML配置方式的更多相关文章

  1. 03_Spring Bean的装配模式_基于Annotation配置方式

    前言 在Spring中尽管使用XML配置文件可以实现Bean的装配工作,但如果应用中Bean的数量较多,会导致XML配置文件过于臃肿,从而给维护和升级带来一定的困难.从JDK 5开始提供了名为Anno ...

  2. Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析

    Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...

  3. struts_20_对Action中所有方法、某一个方法进行输入校验(基于XML配置方式实现输入校验)

    第01步:导包 第02步:配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app ...

  4. struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)

    课时22 基于XML配置方式实现对action的所有方法进行校验   使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...

  5. 转载 - Struts2基于XML配置方式实现对action的所有方法进行输入校验

    出处:http://www.cnblogs.com/Laupaul/archive/2012/03/15/2398360.html http://www.blogjava.net/focusJ/arc ...

  6. Bean的基于XML配置方式

    基于XML配置 Beans.xml <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns= ...

  7. ssm整合(基于xml配置方式)

    本文是基于xml配置的方式来整合SpringMVC.Spring和Mybatis(基于注解的方式会再写一篇文章),步骤如下: (1)首先自然是依赖包的配置文件 pom.xml <project ...

  8. Spring IOC容器装配Bean_基于XML配置方式

    开发所需jar包 实例化Bean的四种方式 1.无参数构造器 (最常用) <?xml version="1.0" encoding="UTF-8"?> ...

  9. Spring 基于xml配置方式的事务

    参考前面的声明式事务的例子:http://www.cnblogs.com/caoyc/p/5632198.html 我们做了相应的修改.在dao中和service中的各个类中,去掉所有注解标签.然后为 ...

随机推荐

  1. shell 脚本 功能性语句 read,expr,test

    1. read 从终端输入数据赋值给变量 read val 把读入的数据存放到val中 #!/bin/bash echo -n "please input two number :" ...

  2. mock.js使用教程

    转载自:https://blog.csdn.net/qq_42205731/article/details/81705350 cdn引入文件 :<script src="http:// ...

  3. SQLite3与C++的结合应用

    SQLite并没有一次性做到位,只有下载这些东西是不能放在vs2010中并马上使用的,下载下来的文件中有sqlite3.c/h/dll/def,还是不够用的.我们需要的sqlite3.lib文件并不在 ...

  4. duilib库分析3.DUILibxml配置

    我这里是借用网友colin3dmax整理的关于duilib的分析哈,感谢他的分享,我觉得很有必要贴出来让大家都学习观摩下 DUILibxml配置项根节点        子类      属性       ...

  5. python封装email模块

    一.代码 from email.mime.text import MIMEText from email.header import Header from email.utils import pa ...

  6. (2)mysql数据类型

    数据类型 1.整数类型 浮点类型 定点数类型 decimal(M,D)也看作(numeric) decimal(8,2) M是定点精度,D是小数位数.指定小数点左边.右边加一起共8位数.也就是整数部分 ...

  7. HttpUrlConnection使用详解--转AAAAA

    http://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/HttpConnection.html HttpUr ...

  8. ELK5.2+kafka+zookeeper+filebeat集群部署

    架构图 考虑到日志系统的可扩展性以及目前的资源(部分功能复用),整个ELK架构如下: 架构解读 : (整个架构从左到右,总共分为5层) 第一层.数据采集层 最左边的是业务服务器集群,上面安装了file ...

  9. Django杂篇(2)

    目录 Django杂篇(2) cookie与session cookie session django中间件 自定义中间件 跨站请求伪造(csrf) CSRF的解决方案 Django杂篇(2) 本文主 ...

  10. Django之13种必会查询

    1.常见的13中查询方式(必须记住) <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> g ...