Spring中的Bean你可以认为是任何一个POJO类
如果想要实现IOC就得使用容器,那么容器怎么知道你有哪些类呢?你得通过某种方式告诉容器,我有叫做什么什么的类,它的位置在哪里哪里。
常用的配置Bean的方法就是使用xml进行配置
常用的bean的属性,或者字段有以下这些:
常见的属性是id和class两个属性,id代表这个Bean的名称,就跟你叫张三,他叫李四一样。class代表的是你定义这个类的位置,在哪个文件夹下面,哪个包下面,叫什么名字,顺着这个位置信息我可以找到这个类定义的位置。
<bean id="bean1" class="com.itheima.Bean1"/>
<bean id="bean2" class="com.itheima.Bean2"/>
Bean的实例化
常见的Bean的实例化方式有三种,构造函数实例化(常用),静态工厂实例化,实例工厂实例化
1. 构造函数实例化
使用无参构造方法进行实例化。
创建一个POJO
注册一个Bean
测试一下
完全没有问题。
2. 静态实例工厂实例化
根据设计模式的说法,我们可以通过静态工厂来创建对象。
创建一个普通的POJO
public class Bean2{
}
创建实例工厂
注册到容器中
注意了!这里配置Bean的时候,路径是静态工厂类的路径,还配置了factory-method来指定使用哪个方法实例化对象。
测试一下
3.实例工厂实例化
使用实例化工厂再去实例化对象
创建一个POJO
public class Bean3{
}
创建实例工厂
注册到容器
注意了!先注册了实例工厂的Bean,然后,在需要实例化的Bean中设置factory-bean引用上述的实例工厂Bean,设置factory-method设置实例化对象调用的实例化工厂的方法名。
测试一下
小结:
使用构造函数进行依赖注入是比较常用的方法,简单。
使用静态工厂进行配置的时候,只需要配置静态工厂方法即可,路径是静态工厂的路径,使用factory-method来指定方法名。
使用实例工厂进行配置的时候,需要配置实例工厂类,也需要配置待实例化的类,添加factory-bean引用实例工厂的Bean,使用factory-method配置实例化的时候需要调用的方法。
Bean的作用域
默认情况下,是singleton,全局就一个Bean的实例,也就是单例,对于无会话状态的Bean是最合适的。
prototype就是另外一个极端了,每次需要创建的时候,他都会new一个实例出来。
后面的几种就是分情况了,常用的就是request,一次请求有一个实例,还有session同一个浏览器的会话使用一个实例。
可以在xml文件注册bean的时候指定scope,默认就是singleton
可以看到,两个对象是同一个:
对于prototype:
可以看到是两个完全不同的对象:
可以对Bean的生命周期进行管理,使用init-method指定初始化的时候调用的方法,使用destory-method指定bean销毁的时候调用的方法。
装配Bean
1. 基于xml文件
a 使用构造函数进行依赖注入
通过构造函数进行注入
指定使用constructor-arg进行注入
使用index确定参数的次序,从0开始。value是简单的值,对于复杂的list需要使用list标签包裹起来。
b 使用setter方法进行依赖注入
通过setter方法注入
通过property进行注入:
name指定字段的名称,value指定简单值。复杂的list需要使用list包裹。
复杂类型的装配:
2. 基于注解
注解是最常用的依赖注入的方式了,常见的注解有:
@Component表示一个Bean
@Repository代表数据访问层的Bean
@Service代表业务逻辑层的Bean
@Controller代表控制器Bean
@Autowired对于变量,setter方法,构造方法进行注解,配合进行注入
@Resource作用与@Autowired类似,使用name注解Bean的名称,type注解Bean的类型。
@Qualifier对于多实现的接口进行注入的时候,指定是哪个实现
定义一个Dao接口:
定义Dao实现类:
定义Service接口:
定义Service实现类:
这里就使用了@Resource配合依赖注入
修改配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:annotation-config />
<context:component-scan base-package="com.learn.ioc" />
</beans>
测试
效果