Spring配置文件:

1.Bean标签基本配置:

用于配置对象交由Spring来创建、

默认情况下他调用的是类中的无参构造函数, 如果没有无参构造函数则不能创建成功。

基本属性

  • id:Bean实例在Spring容器中的唯一标识
  • class:Bean的全限定名称。

2.Bean标签范围配置:

scope:指对象的作用范围:取值如下:

7tyW6I.png

注意

1.Spring中scope默认值为”singleton

2.当sope的取值为singleton时,

​ Bean的实例化个数:1个

​ Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例。

​ Bean的生命周期:

  • 对象创建:当应用加载,创建容器时,对象就被创建了
  • 对象运行:只要容器在,对象一直活着
  • 对象销毁:当应用卸载,销毁容器时,对象就被销毁了

3.当sope的取值为prototype时,

​ Bean的实例化个数:多个

​ Bean的实例化时机:当调用getBean()方法时实例化Bean

​ Bean的生命周期:

  • 对象创建:当调用对象时,创建新的对象实例
  • 对象运行:只要对象在使用中,就一直活着
  • 对象销毁:当对象长时间不用时,被java的垃圾回收器(jc)回收

3.Bean生命周期配置:

  • init-method:指定类中的初始化方法名称
  • destroy-method:指定类中销毁方法名称

4.Bean实例化三种方式:

  • 无参构造方法实例化(重要

  • 工厂静态方法实例化

  • 工厂实例方法实例化

    工厂实例化的具体操作

静态方法

​ 1.创建StaticFactory工厂类,定义静态方法

​ 2.修改配置文件

1
<bean id = "UserDao" class = "factory.StaticFactory" factory-method = "getUserDao"> </bean>                  //factory-method是静态类方法

实例方法

​ 1.创建DynamicFactory工厂类,定义非静态方法

​ 2.修改配置文件

1
2
3
4
<bean id = "factory" class = "factory.DynamicFactory" </bean>  //首先时工厂类的配置文件

<bean id = "UserDao" factory-bean = "factory"> factory=method = "getUserDao"> </bean>
//其次是工厂类实例化对象的配置文件,id映射dao对下,factory-bean映射factory工厂类

5.引入其他配置文件(分模块开发)

实际开发中,Spring的配置内容非常多,导致Spring配置很繁杂,所以,可以将部分配置拆解到其他配置文件中,然后进行引用:

1
2
在主配置文件中引用:
<import resource = "applicationContext-xxx.xml">

最后,给出一个总结图:

7tcZxs.png

Spring依赖注入:

注入Dao层对象

需求:我们想让Spring不仅仅帮我们创建dao层对象UserDao,也帮我们创建service层对象UserService。

当然,我们可以首先在配置文件中增加class = ”service“ 的bean标签,然后使用同样生成工厂然后getBean的方法获取Service对象,但这样需要两次调用工厂,并且dao对象是通过Service创建的,因此两者之间依然存在耦合关联:

7ty2pd.png

那么,有什么方法可以建设这种业务层和数据访问层之间的耦合关系呢?

我们可以在Spring容器阶段就将dao注入到service中,然后程序可以从Spring中直接获取带有UserDao对象的UserService实例,而两者之间的依赖关系由Spring去维护。

有两种注入方法:

  • 通过set方法,在service类中增添setUserDao方法,将dao对象赋值给service类中的成员变量dao中。

  • 通过有参构造方法,将dao对象赋值给service类中的成员变量dao中。

7ty6te.png

具体操作:

1.创建service类,类里实现有参构造或者set方法。

2.修改配置文件:

第一种set方法:

1
2
3
4
5
6
7
8
9
10
<bean id = "UserService" class = "UserService.UserServiceImpl">
<property name = "UserDao" ref = "UserDao"> </property>
//name对应set方法的函数名,ref对应具体的UserDao对象的映射,引用到函数的参数上。
</bean>

另外,set方法可以增加p名称空间,即在xml配置文件中增加:
xmlns:p="http://www.springframework.org/schema/p"
上述两行代码可更改为:
<bean id = "UserService" class = "UserService.UserServiceImpl" p:UserDao-ref = "UserDao"/>

第二种有参构造:

1
2
3
4
<bean id = "UserService" class = "UserService.UserServiceImpl">
<constructor-arg name = "UserDao" ref = "UserDao"> </constructor-arg>
//name对应有参构造方法的函数名,ref对应具体的UserDao对象的映射,引用到函数的参数上。
</bean>

同样,也可以注入基本数据类型,

如int,String等都可以进行注入。

同样可以通过set和有参构造注入。

配置文件:

1
2
3
4
5
<bean id = "UserService" class = "UserDao.UserDaoImpl">
<property name = "username" value = "zhangsan"/>
<property name = "age" value = "18"/>
//通过propertyname属性将username和age两个基本数据类型的成员变量注入。
</bean>

最后,注入集合数据类型:

以列表为例,首先类中由成员变量List集合:List< String > strList

修改配置文件:

1
2
3
4
5
6
7
8
9
10
11
<bean id = "UserService" class = "UserDao.UserDaoImpl">
<property name = "strList">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
//通过propertyname属性将strList中各项赋值,因为是list集合,要用list标签赋值
//如果是map集合,则用map标签,里边用<entry key = " " value = " "> </entry>标签赋值。
</bean>
注意:无论是什么数据类型的注入,value-ref或者key-ref或者单独ref都表示引用,等于的都是实际的对象,即其他对象标签的id。