一、Bean的生命周期

1.概述

     Spring IOC容器可以管理Bean的生命周期,Spring 允许在Bean的生命周期的特定点执行定制的任务。

     Spring IOC容器对Bean的生命周期进行管理的过程:

     (1)通过构造器或工厂方法创建Bean实例。

     (2)为Bean的属性设置值和对其他Bean的引用。

     (3)调用Bean的初始化方法。

     (4)Bean可以使用了。

     (5)当容器关闭时,调用Bean的销毁方法。

     在Bean声明里设置init-method和destroy-method属性,为Bean指定初始化和销毁的方法。

Car.java

public class Car{

	private String brand;

	public Car(){
System.out.println("Car()......");
} public Car(String brand){
this.brand = brand;
} public void init(){
System.out.println("init()......");
} public void destroy(){
System.out.println("destroy()......");
} @Override
public String toString(){
return "Car [brand=" + brand + "]";
} public String getBrand(){
return brand;
} public void setBrand(String brand){
this.brand = brand;
System.out.println("setBrand()......");
} }

applicatContext.xml

<bean id="car" class="com.kiwi.domain.Car"
p:brand="LandRover"
init-method="init"
destroy-method="destroy"
/>

结果:

     Car()......

     setBrand()......

     init()......

     Car [brand=LandRover]

     destroy()......

 

2.创建Bean的后置处理器

     (1)后置处理器允许在调用初始化方法前后对Bean进行额外的处理。

     (2)Bean后置处理器对IOC容器所有Bean实例逐一进行处理。

     (3)对Bean后置处理器而言,需要实现BeanPostProcessor接口。

     添加后置处理器后,Bean的生命周期:

     (1)通过构造器或工厂方法创建Bean实例。

     (2)为Bean的属性设置值和对其他Bean的引用。

     (3)将Bean传给Bean的后置处理器的postProcessBeforeInitialization()方法

     (4)调用Bean的初始化方法。

     (5)将Bean传给Bean的后置处理器的postProcessAfterInitialization()方法

     (6)Bean可以使用了。

     (7)当容器关闭时,调用Bean的销毁方法。

MyBeanPostProcessor.java

public class MyBeanPostProcessor implements BeanPostProcessor{

	//init方法执行之前执行该方法
@Override
public Object postProcessBeforeInitialization(Object bean,String beanName) throws BeansException{
System.out.println("postProcessBeforeInitialization..." + bean);
return bean;
} //init方法执行之后执行该方法
@Override
public Object postProcessAfterInitialization(Object bean,String beanName) throws BeansException{
System.out.println("postProcessAfterInitialization..." + bean);
return bean;
}
}

applicationContex.xml

<?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:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean id="car" class="com.kiwi.domain.Car"
p:brand="LandRover"
init-method="init"
destroy-method="destroy"
/> <!-- 配置Bean的后置处理器 -->
<bean class="com.kiwi.domain.MyBeanPostProcessor"/> </beans>

结果:

     Car()......

     setBrand()......

     postProcessBeforeInitialization...Car [brand=LandRover]

     init()......

     postProcessAfterInitialization...Car [brand=LandRover]

     Car [brand=LandRover]

     destroy()......

 

二、Bean的实例化方式

1.通过全类名(反射)

     <bean id="" class=""/>

 

2.通过静态工厂方法

     <bean id="" class="工厂类" factory-method="静态方法">

(1)通过静态工厂方法创建Bean是将对象创建的过程封装到静态方法中。当客户需要创建对象时,只需要简单的调用静态方法,而不关心创建对象的细节。

(2)要声明通过静态方法创建的Bean,需要在Bean的class属性指定拥有该工厂方法的类,同时在factory-method属性指定工厂的方法名称,使用<constrctor-arg>元素为该方法传递参数。

StaticFactory.java

public class StaticFactory{

	private static Map<String,Car> cars = new HashMap<String,Car>();

	static{
cars.put("LandRover",new Car("LandRover",800000));
cars.put("Audi",new Car("Audi",500000));
} public static Car getCar(String name){
return cars.get(name);
}
}

applicationContext.java

<?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:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!--
通过静态工厂方法来配置bean
class: 指向静态工厂的全类名
factory-method: 指向静态工厂方法的名字
constructor-arg: 如果工厂需要传入参数,则使用constructor-arg类配置参数
-->
<bean id="car" class="com.kiwi.domain.StaticFactory" factory-method="getCar">
<constructor-arg value="Audi"/>
</bean>

Test.java

	@Test
public void testCar(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = (Car)context.getBean("car");
System.out.println(car);
}

结果:

     Car [brand=Audi, price=500000.0]

 

3.实例工厂方法

     <bean id="工厂实例" class="">

     <bean id="" factory-bean="工厂实例" factory-method="普通方法">

     将对象的创建过程封装到另外一个对象的实例方法中。

 

InstanceFactory.java  

public class InstanceFactory{

	private Map<String,Car> cars;

	public InstanceFactory(){
cars = new HashMap<String,Car>();
cars.put("LandRover",new Car("LandRover",800000));
cars.put("Audi",new Car("Audi",500000));
} public Car getCar(String name){
return cars.get(name);
}
}

applicationContext.java

<?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:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!--配置工厂的实例 -->
<bean id="instanceFactory" class="com.kiwi.domain.InstanceFactory"/> <!-- 通过实例工厂来配置bean -->
<bean id="car" factory-bean="instanceFactory" factory-method="getCar">
<constructor-arg value="LandRover"/>
</bean> </beans>

Test.java

@Test
public void testCar(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = (Car)context.getBean("car");
System.out.println(car);
}

结果:

     Car [brand=LandRover, price=800000.0]

 

三、基于注解配置Bean

1.组件扫描

(1)组件扫描(component scanning): Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件。    

(2)特定组件包括:

     @Component: 基本注解,标识一个受Spring管理的组件。

     @Respository: 标识持久层组件。

     @Service: 标识业务层组件。

     @Controller: 标识表现层组件。

(3)对于扫描到的组件,Spring有默认的命名策略。使用非限定类名,第一个字母小写,也可以在注解中通过value属性值标识组件的名称。

(4)当在组件类上使用了特定的注解之后, 还需要在 Spring 的配置文件中声明 <context:component-scan>

   A:base-package属性指定一个需要扫描的基类包,Spring 容器将会扫描这个基类包里及其子包中的所有类。

   B:如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类。

   C:<context:include-filter> 子节点表示要包含的目标类。

   D:<context:exclude-filter> 子节点表示要排除在外的目标类。

   E: 以上两个子节点支持以下类型:

       

 

2.自动装配Bean

(1)Spring通过@Autowired注解实现Bean的自动装配

  

 

(2)使用Autowired的required的属性

    

 

(3)使用@Qualifier指定注入Bean的名称

     容器中如有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称。

    

(4)对类方法进行标注

     @Autowired可以对类成员变量及方法的入参进行标注。

    

    

Spring基础学习(三)—详解Bean(下)的更多相关文章

  1. Spring基础学习(二)—详解Bean(上)

         在Spring配置文件中,用户不但可以将String.int等字面值注入Bean中,还可以将集合.Map等类型注入Bean中,此外还可以注入配置文件中其他定义的Bean. 一.字面值     ...

  2. 框架基础学习之--详解web+maven+spring+mybatis+struts框架文件夹作用

    详解web+maven+spring+mybatis+struts框架文件夹作用 1.程序名 2.Mybatis,mybatis是数据持久层,就是和对象类有关系的东西 3.存放java文件,xml,p ...

  3. C#基础表达式语句详解(下)

    书接上文: 4.选择语句:if语句和switch语句 4.1If语句:statement:两种格式:A与B A:If(boolean-expression)embedded-statement(嵌入式 ...

  4. Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!

    点击下方链接回顾往期 不要再说不会Spring了!Spring第一天,学会进大厂! Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官! 今天讲解Spring中Bean的生命周期. ...

  5. Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)

    上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...

  6. Window下PHP三种运行方式图文详解,window下的php是不是单进程的?

    Window下PHP三种运行方式图文详解,window下的php是不是单进程的? PHP运行目前为止主要有三种方式: a.以模块加载的方式运行,初学者可能不容易理解,其实就是将PHP集成到Apache ...

  7. Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计

    在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...

  8. Spring框架系列(12) - Spring AOP实现原理详解之JDK代理实现

    上文我们学习了SpringAOP Cglib动态代理的实现,本文主要是SpringAOP JDK动态代理的案例和实现部分.@pdai Spring框架系列(12) - Spring AOP实现原理详解 ...

  9. Spring Boot 自定义日志详解

    本节内容基于 Spring Boot 2.0. 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启的 2 种方式 Spring ...

随机推荐

  1. 初识html5——试试博文编辑器

    1.html5简介 HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTML5 仍处 ...

  2. Visual Studio 2013 百度云下载地址

    Visual Studio 2013 百度云下载地址 链接:http://pan.baidu.com/s/1sjFifox 密码: ipqe VS2013注册码:BWG7X-J98B3-W34RT-3 ...

  3. 令人眼前一亮的下拉式终端 Tilda & Guake

    前言 老夫是 Linux 的老用户. 大一的时候某不方便透露姓名的校内组织给了一个 Fedora 13 的安装光盘,然后老夫学会了重装 Windows. 大二的时候知道了 Ubuntu ,开始在虚拟机 ...

  4. 【2-23】分支语句(switch…case)及循环语句

    Switch-case分支语句与if语句作用相同,但需将情况都罗列出比较麻烦所以不常用. 其基本结构是: Switch(一个变量值) { Case 值1:要执行的代码段:break; Case 值2: ...

  5. Web API框架学习——路由(一)

    HttpConfiguration(ASP.NET Web API管道的配置是通过HttpConfiguration来完成) : 包括路由注册在内的对整个ASP.NET Web API管道的配置是通过 ...

  6. 【转】Lucene.NET详细使用与优化详解

    1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工 ...

  7. javaList容器中容易忽略的知识点

    在集合类框架中,List是使用比较多的一种 List |---Arraylist 内部维护的是一个数组,查找快增删慢 |---LinkedList 底层是链表,增删快查询慢. |---Vctor线程安 ...

  8. system()、exec()、fork()三个与进程有关的函数的比较

    启动新进程(system函数) system()函数可以启动一个新的进程. int system (const char *string ) 这个函数的效果就相当于执行sh –c string. 一般 ...

  9. 如何用正确的姿势查看 主机系统的CPU信息

    一.关于CPU的几个概念 CPU的作用 计算机中的中央处理单元(CPU)执行基本的计算工作 -- 运行程序.但是,一个单核的CPU同一时间只能一次执行一个任务,为了提高计算机的处理能力,也就出现了多C ...

  10. IOS推送--之开发模式测试

    参考文章:http://blog.csdn.net/showhilllee/article/details/8631734#comments 第一步.下载你工程的开发证书 第二步.从钥匙串访问中导出秘 ...