1-首先知道Bean是什么?
spring中默认bean对象是单例的(默认为singleton)-要想切换成非单例的,将scope属性更改为protype即可。
<bean id="xxx" class="xxx" scope="prototype" />
1.1 为什么bean默认是单例
因为bean对象是交给spring容器进行管理的。如果bean不是非单例的,那么bean的数量会有无穷个,每用一次都要重新造一个bean,spring并不是帮我们管理这样的bean的,事实上spring在帮我们管理的是我们可以复用的对象。比如A方法使用x对象,造了一次x的bean对象,B方法也使用x对象,又造了一次x的bean对象,这样的话效率很低。因此,spring默认的就是造单例对象,可以进行复用。
2-Bean是如何创建的?
bean本质上就是对象,Java中创建对象有两种方式,分别是new,构造方法。
在spring中通过构造方法来创建对象。
3-实例化Bean的三种方式
3.1-通过构造方法实例化Bean
package com.yfzhang.dao;
public interface BookDao{
public void save();
}
package com.yfzhang.dao.impl;
public class BookDaoImpl implements BookDao{
public BookDaoImpl(){
System.out.println("公共无参构造方法被调用");
}
public void save(){
System.out.println("BookDaoImpl的save方法被调用")
}
}
<bean id="bookDao" class="com.yfzhang.dao.impl.BookDaoImpl" />
此时控制台可以输出“公共无参方法被调用”
将构造方法私有化以后呢?
package com.yfzhang.dao.impl;
public class BookDaoImpl implements BookDao{
private BookDaoImpl(){
System.out.println("公共无参构造方法被调用");
}
public void save(){
System.out.println("BookDaoImpl的save方法被调用")
}
}
此时控制台仍然可以输出“公共无参方法被调用”
由此可得,spring肯定调用了构造方法,并且无论私有公有都可以使用。那么私有的方法,怎么得到呢-------通过反射。
将无参构造方法改为有参构造方法后呢?
package com.yfzhang.dao.impl;
public class BookDaoImpl implements BookDao{
public BookDaoImpl(int i){
System.out.println("公共有参构造方法被调用");
}
public void save(){
System.out.println("BookDaoImpl的save方法被调用")
}
}
此时会报错-bean对象初始化失败--javase中提到过,当前情况有参构造方法会覆盖掉无参构造方法
3.2通过静态工厂实例化Bean
有一个OrderDao
这是orderdao的实现类,重写了save方法
这是一个工厂-orderdaofactory,在里面有一个静态的工厂,方法名叫做getOrderDao
这是main函数
用这样的方式造出来的,交给spring管理应该怎么管理呢---怎么管理这个bean?
class后面配的是工厂类名,factory-method还要配置工厂里面真正用于造对象的方法名
<bean
id="orderDao" factory-method="getOrderDao" class="com.yfzhang.factory.OrderDaoFactory"
/>
3.3通过实例化工厂初始化Bean
userdao一个接口
一个实现类,重写了save方法
同3.2也有一个工厂,但是,是一个非静态方法
main函数。因为不是静态方法所以要先创建一个工厂对象,
然后通过工厂对象再创建对象调用save方法
用这样的方式造出来的,交给spring管理应该怎么管理呢---怎么管理这个bean?
首先造工厂的bean对象,然后再通过这个工厂对象获取工厂的方法
<bean id="userFactory" class="com.yfzhang.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory" />
3.4对实例化工厂初始化bean的改造
弊端:
factory包下定义一个UserDaoFactoryBean类 实现FactoryBean接口(实现的接口必须为此)
想造什么对象,泛型就写什么。本文想造UserDao对象,所以泛型写UserDao
实现接口要重写方法
1-得到bean实例
2-得到bean类型
此时更改单例,非单例不再通过bean标签修该
直接在新加的类中添加方法isSingleton,返回值为true就是单例,反之 非单例
3-设定bean是不是单例
用这样的方式造出来的,交给spring管理应该怎么管理呢---怎么管理这个bean?
class此时写新创建的工厂类(程序不需要改其他任何东西)
<bean id="userDao" class="com.yfzhang.factory.UserDaoFactoryBean" />
4-Bean的生命周期
可以使用接口控制生命周期。容器关闭后才会执行destory方法。
也可以使用xml配置文件
bean的生命周期
5-依赖注入方式
5.1-setter注入
5.1.1-简单类型
5.1.2-引用类型
ref是来做引用类型的
5.2-构造器注入
5.2.1-简单类型
5.2.2-引用类型
6-自动装配
6.1 按类型自动装配
仅需autowire 此时的类型对应id=“bookDao”
7-加载properties文件
开启context命名空间,生成一个全新的叫做context的空间
8-容器
9-纯注解开发
9.1-注册定义Bean
9.2-生命周期
9.3-自动装配
引用类型
简单类型
配置文件
9.4-第三方bean管理
写一个新的方法,自己手写代码。返回值就是要的bean
把管理对象的方法移出去 然后再配置类中导入进来
9.5-第三方bean依赖注入
配置类的成员变量往里给就行了