监听器
把对象放入对象池(把类注册到对象池)的方法
- 使用注解 + <context:component-scan>
- @Component:可以标记任何类,没有任何特殊含义
- @Controller:标记控制器类,明确地暗示这个类是一个控制器类。Spring对象池本身不在乎对象是什么,对SpeingMVC有作用
- @RestController:标记控制器类,每一个请求处理方法自动被标记为@ResonueBody
- @Service:标记服务类
- Reposilory:标记数据访问类(Dao)
- 上面的注解实际都是@Componet,只是名字不同,名字对程序起到暗示作用,而在@Componer本身也是一个记号,用来告诉扫描器,将标记类注册到对象池中。
- <component-scan>有子标签,可以决定扫描那些包,排除那些包,从而让注释扫描更精确,速度更快。
- 不足之处:使用注解的不足是,获取到的对象仅仅是无参构造方法初始化产生的,其属性并没有我们需要的赋值
- 在对象池的配置文件中,详细的描述bean
- 通过<bean>标签可以向对象池中添加对象(或对象工厂)
- 好处是:可以随意初始化bean对象
- 可以调用有参构造方法
- 可以通过调用setter给属性赋值
<bean class> = "对象的类"
<constradcr-arg/>
<constradcr-arg/>
</bean>
<bean class="对象的类">
<property name="属性名" value=“属性值”/>
</bean>
如果属性值是其它
bean
<bean class=””>
<property name=”
属性名”
ref=“其它bean
名字” />
<property name=”
属性名”>
<ref local=“本对象池中的其它bean
名字” />
<ref parent=”
父对象池中的bean
名字” />
<ref bean=”
其它bean
名字” />
</property>
</bean>
如果想给属性值(一个对象)的属性赋值
<bean class=””>
<property name=”
属性名
.
属性名” >
</bean>
如果属性值比较复杂
<bean class=””>
<property name=”
列表属性”>
<list>
<value>
列表项1</value>
<value>
列表项2</value>
</list>
</property>
</bean>
<bean class=””>
<property name=”
集合属性”>
<set>
<value>
列表项1</value>
<value>
列表项2</value>
</set>
</property>
</bean>
<bean class=””>
<property name=”
字典属性”>
<entry key=”
名称1” value=”
值1” />
<entry>
<key><value>名称2</value></key>
<value>
值2</value>
</entry>
<entry>
<key><value>名称3</value></key>
<value>
值3</value>
</entry>
</property>
</bean>
//
能够
创建
对象的方法被称为
工厂方法
如果没有公开的构造方法(通过工厂方法创建对象)
<bean class=”
对象的类” factory-method=”
能创建对象的静态方法” />
<bean class=”
对象的类” factory-bean=”
工厂bean”
factory-method=”
能创建对象的实例方法” />
指定
Bean
的作用域
@Scope(“
作用域名”)
<bean scope=”
作用域名”>
指定
Bean
的名称
不指定名称时,通过类全名生成,如果同一个类有多个bean
则后面加#1
编号
注解指定 @Component(“beanName”)
配置指定 <bean id=”beanName”>
<bean name=”beanName1, beanName2,…”>
指定别名 <alias name=”beanName” alias=”beanAlias” />
在同一个对象池中名字不能重复
指定名称后有利于通过编程方式以 getBean()
方法获取bean
获取
Bean
@Autowired
按类类型注入,如果对象池中存在多个本类的对象,则报错
@Qualifier(‘beanName’)
多个对象时,限定取哪一个
@Lazy
懒创建,使用时才创建bean
,有利于减少内存及加快启动速度
默认情况下,对象池创建时,会创建所有的
bean
可以在<beans>根标签上添加 default-lazy-init=”true”
让本对象池整体懒创建
@Resource
按类型
@Resource(“beanName”)
按名字
编程:对象池.getBean();
获取
Bean
对象池
在Bean
类实现BeanFactoryAware或ApplicationContextAware
参与
Bean
的生命周期
注解 @PostConstruct, @PreDestroy …
当bean
构造完成后或销毁前会调用@PostConstruct, @PreDestroy
标记的方法
接口 InitialzingBean
也可以获得相应的事件,而且还多了一个
afterPropertiesSet() //
在属性都设置完成后会调用