Spring注解开发
Bean的作用域
作用域
singleton
单例(默认值), 在每个SpringIOC容器中,一个bean定义对应一个对象实例
prototype
一个bean定义对应多个对象实例
request
在一次HTTP请求中,一个bean定义对应一个实例,即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于Web的Spring ApplicationContext的情况下有效。
session
在一个HTTP Session 中,一个bean定义对应一个实例。该作用域仅在基于Web 的SpringApplicationContext的情况下有效
global session
在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于Web的Spring ApplicationContext的情况下有效
注解形式
1 | "stu") ( |
配置文件形式
1 | <bean id="student" class=" com.ehshyee.entity.Student"> |
分别对其获取两个学生 查看是否为同一个
1 | Student stul = (Student) context.getBean(S:"student") ; |
均返回true
在xml中scope默认是singleton
可改为prototype
。
1 | <bean id="student" class=" top.ehshyee.entity.Student" scope="prototype"> |
改后返回false
注解中添加
1 | //默认singleton |
对于实例产生的时机
一些测试
1 | public Student() { |
singleton | prototype
执行时机(产生bean的时机) :
(default)singleton:容器在初始化时,就会创建对象(唯一的一个);以后再getBean时,不再产生新的bean.singleton也支持延迟加载(懒加载) :在第一次使用时产生。
prototype:容器在初始化时,不创建对象;只是在每次使用时(每次从容器获取对象时,context.getBean(Xxxx)),再创建对象,并且,每次getBean()都会创建一个新的对象。
延迟加载(注解形式)
1 |
条件注解 –>SpringBoot
可以让某一个Bean在某些条件下加入Ioc容器,其他情况下不加IoC容器。
a.准备bean
1 | public interface Car { |
b.增加条件Bean:给每个Bean设置条件,必须实现Condition接口
1 | public class OilCarCondition implements Condition { |
c.根据条件加入IOC容器
1 |
|
测试
在VM option中添加参数为oil-Dcar.type=oil
1 | public static void testAnnotation { |
给IoC加入Bean的方法
注解:
三层组件: 扫描器+三层注解
非三层组件@Confiquration:
- @Bean+返回值
- @import
- FactoryBean(工厂 Bean)
@import使用:
①直接编写到@Import中
1 |
|
②自定义ImportSelector接口的实现类,通过selectimports方法实现,方法的返回值就是要纳入IoC容器的Bean),并告知系统自己编写的实现类。
1 | public class MyImportSelector implements ImportSelector { |
1 |
③编写ImportBeanDefinitionRegistrar接口的实现类,重写方法
1 | public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{ |
1 |
FactoryBean(工厂 Bean)
写注册类
1 | public class MyEactoryBean implements FactoryBean |
bean中实现
1 |
|
拿myFactoryBean中的值
1 | object obj (context. getBean( "myFactoryBean") ); |
&
:不加&获取的是最内部真实的Apple;
Bean的生命周期
创建(new …)、 初始化(赋初值)、….销毁(servlet)
方法一:
init destroy
xml :
1 | <bean id="StudentDao" class="top.eshyee.dao.impl.StudentDaoImpl" init-method="" destroy-method=""></bean> |
注解:
1 |
IoC容器在初始化时,会自动创建对象(构造方法) ->init ->…..-> 当容器关闭时调用destroy..
方法二:
三层组件: 扫描器+三层注解(功能性注解+MyIntToStringConverter. java转换器)@Controller、@Service、@Repository、@Component
JAVA规范:JSR250
@PostConstruct:相当于方法一的init
@PreDestroy:相当于方法- - 的destroy
1.将响应组件加入@Component注解、给初始化方法加@PostConstruct、给销毁方法加@PreDestroy
如果要获取@Component注解中的bean,那么该Bean的名字就是@Component (value= “xxx”)的value值
调用
1 | MyIntToStringConverter converter= (MyIntToStringConverter) context.getBean |
方法三:
双接口
三层组件
InitializingBean初始化
DisposableBean销毁
初始化:只需要实现InitializingBean中 的afterPropertiesSet()方法
销毁:实现DisposableBean 中的destroy()方法
∴
如果是注解形式,随便写一个方法,然后加上相应注解即可
如果是接口形式,必须实现接口中规定的方法
方法四:
三层组件
单接口:
接口BeanPostProcessor:拦截了所有容器中的Bean