`
Luob.
  • 浏览: 1590384 次
  • 来自: 上海
社区版块
存档分类
最新评论

spring 第4天bean继承,init,destory-method

阅读更多
深入理解Spring容器中的bean
使用抽象bean
1.抽象bean被作为一种模板,在spring中被应用,在ApplicationContext初始化的时候,不会初始化抽象bean, 因此抽象bean的配置中可以没有 class.
2.抽象bean的作用主要是为了减少配置文件中多个bean之间拥有的重复的配置.
3.子bean无法从父bean中继承如下属性:depends-on,autowire,singleton,scope,lazy-init
4.如果 父bean写了class 则 子bean可以不用写class 和父类共用同一个实现类.
5.如果 父bean没有写class,则子bean必须写class
6.如果 父bean写了class,子bean也写了class,子bean覆盖 父bean的属性

<!-- 抽象bean -->
      <bean id="personTemplate" class="cn.sh.springmvc_java.Chinese" abstract="true">
      	<property name="axe" ref="stoneAxe_sf"/>
      </bean>
      <bean id="personTemplate1" abstract="true">
      		<property name="axe" ref="steelAxe_sf"/>
      </bean>
      
      <!--  子bean继承 -->
      <bean id="china_child" parent="personTemplate"/>
      
      <!-- 子bean 覆盖父类的bean -->
      <bean id="china_child1" parent="personTemplate">
      	<property name="axe" ref="steelAxe_sf"/>
      </bean>

spring的bean继承和java中继承完全不一样
1.spring中子bean和父bean可以是不同的类型,但java中继承可以保证子类是一种特殊的父类
2.spring中的bean的继承是实例之间的关系,因此主要表现为参数的延续;而java中的继承是类之间的关系,主要表现在方法和属性的延续
3.spring中子bean不可以作为父bean使用,不具备多态性,java中的子类实例完全可以当成父类实例使用


容器中的工厂bean:
1和前面介绍的静态工厂创建bean和实例工厂创建bean有区别,这里的工厂bean是spring中一种特殊的bean,该工厂bean必须实现FactoryBean接口,而且实现后的bean
只能作为工厂bean使用.
2.而且通过getBean()来获取工厂bean的时候返回的不是FactoyBean,而是工厂bean生产的java
实例
3.如果要获取 factoryBean 要在bean的id 前面加上  "&"

package cn.sh.springmvc_java.factory;

import org.springframework.beans.factory.FactoryBean;

import cn.sh.springmvc_java.American;
import cn.sh.springmvc_java.People;

/**
 * 采用 spring的工厂bean:默认 是singleton
 *
 */
public class PeopleFactory1 implements FactoryBean<People>{

	//People p=null;
	//这个方法只调用一次, 因为 scope="singleton" 如果prototype 就会每次调用
	@Override
	public People getObject() throws Exception {
	/*	// TODO Auto-generated method stub
		if(p==null){
			p=new American();
		}*/
		System.out.println("1");
		return new American();
	}

	@Override
	public Class<?> getObjectType() {
		// TODO Auto-generated method stub
		return American.class;
	}

	@Override
	public boolean isSingleton() {
		// TODO Auto-generated method stub
		return true;
	}
	
}


<!--可以去掉prototye 属性,这样 就是默认的单例了-->
<bean id="people" class="cn.sh.springmvc_java.factory.PeopleFactory1" scope="prototype"/> 


	/**
	 *测试 采用 factoryBean 创建的对象  发现获取不了配置ID
	 * xml创建的对象 可以获取配置时候的id 
	 */
	@Test
	public void test13(){ 
		ApplicationContext act=new ClassPathXmlApplicationContext("classpath*:applicationContent.xml");
		People p=act.getBean("people",People.class);
		System.out.println(p.sayHello("Mary"));
		System.out.println(p.sayGoodBye("Mary"));
		People p1=act.getBean("people",People.class);
		System.out.println(p==p1);  //单例就为true 否则为false

		//获取 factoryBean 本身
		System.out.println(act.getBean("&people"));
		System.out.println(p.getClass());
		p.toString();
		
		People pa=act.getBean("american",People.class);
		System.out.println(pa.sayHello("Mary"));
		System.out.println(pa.sayGoodBye("Mary"));
		pa.toString(); //会打印出 配置的id
	}


获取bean在配置文件中ID
实现BeanNameAware 的setBeanName(String name);


package cn.sh.springmvc_java;

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
/**
 * BeanNameAware 实现后,可以获取该bean的定义时的id
 * InitializingBean 实现后,可以在 spring初始化Bean完成后,执行指定的方法
 * DisposableBean :Bean在被销毁前,执行特点的方法
 * 
 * 注意: DisposableBean的 destory 方法 和 配置文件中的destory-method 只对scope的 singleton Bean有用
 *   可以将 Beans 的 default-init-method 和 default-destory-method和Bean的 方法 联合起来用 
 */
public class American implements People,BeanNameAware,InitializingBean,DisposableBean {

	private String beanName;
	
	@Override
	public void setBeanName(String name) {
		// TODO Auto-generated method stub
		System.out.println("执行BeanNameAware 的set方法 获取BeanName");
		this.beanName=name;
	}
	
	@Override
	public String sayHello(String name) {
		// TODO Auto-generated method stub
		return name+",hello";
	}

	@Override
	public String sayGoodBye(String name) {
		// TODO Auto-generated method stub
		return name+",Good Bye";
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		System.out.println("china实现类,部署该Bean是指定的ID为:"+beanName);
		return null;
	}

	//实现InitializingBean后,可以在初始化完成后 调用下面的方法   这样有代码污染
	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("正在执行InitializingBean接口的afterPropertiesSet");
	}
	
	//在配置文件中配置  init-method  这种没有代码污染 推荐
	public void init(){
		System.out.println("init-method:正在初始化....");
	}

	@Override
	public void destroy() throws Exception {
		System.out.println("实现DisposableBean,即将被销毁...");
	}
	
	public void close(){
		System.out.println("destory-method:即将被销毁.....");
		
	}

	public String getBeanName() {
		return beanName;
	}
	
}

容器中bean的生命周期
1.spring可以管理singleton 作用域的bean的生命周期,spring可以精确的知道该bean何时被创建,何时初始化完成,容器何时销毁该bean.
2.对于prototype的bean.spring只负责创建,之后,完全交割客户端代码,容器不在跟踪其生命周期.

依赖关系注入之后的行为 spring提供了两种方式完成
1.使用init-mehtod
2.实现initializingBean 接口
3.如果这两个都写了, 会先执行 initialingBean 接口的方法 然后执行  init-method

Bean销毁之前的行为
1.使用 destory-method
2.实现despoableBean接口

    <bean id="peopleFactory" class="cn.sh.springmvc_java.factory.PeopleFactory"/>
      <bean id="china" factory-bean="peopleFactory" factory-method="getPeople">
      	<constructor-arg value="chin"/>
      </bean>
      <bean id="american" factory-bean="peopleFactory" factory-method="getPeople" scope="prototype" init-method="init" destroy-method="close">
      	<constructor-arg value="ame"/>
      </bean>

//测试init -method 和 destory -method
	@Test
	public void test15(){
		AbstractApplicationContext act=new ClassPathXmlApplicationContext("classpath*:applicationContent.xml");
		People pa=act.getBean("american",People.class);
		pa.toString();
		//未来让spring容器注册关闭钩子
		act.registerShutdownHook();
		System.out.println("aaa");
		pa=null;
		System.gc();
	}
分享到:
评论

相关推荐

    Spring Bean的初始化和销毁实例详解

    在本文中,我们详细讲解了Spring Bean的初始化和销毁,包括使用@Bean的initMethod和destroyMethod、JSR-250的@PostConstruct和@PreDestroy注解等多种方式来控制Bean的生命周期。在实际开发中,我们可以根据需要选择...

    基于springioc bean 的几个属性介绍

    4. destory-method 属性 destory-method 属性用于指定在 Spring 容器关闭或销毁时调用的方法。这只适用于单例模式,用于释放资源、关闭连接等操作。 这些基于 Spring IOC Bean 的几个属性可以帮助开发者更好地控制...

    myspringlearning:Spring学习项目

    namebeans.xml简单属性的注入UserDAOImpl连接池需要bean的scope属性singleton单例prototype原型官方文档,scope集合注入设置好set,get方法在bean中设置好值自动装配auto-wire生命周期lazy-initinit-method,destory-

    spring启动加载程序的几种方法介绍

    init-method="initMethod" destory-method="destroyMethod"/&gt; ``` 对应的Java类可以像这样定义: ```java public class DataInitializer { public void initMethod() throws Exception { System.out.println(...

    Spring中Bean的生命周期使用解析

    9. 自定义的inti-method指定的方法:如果配置文件中使用init-method属性指定了初始化方法,那么Bean在实例化完成后将会调用该属性指定的初始化方法进行Bean的初始化。 在这个阶段,如果配置文件中指定了初始化方法...

    spring配置实例化后执行的销毁方法比对

    spring配置对象实例化后执行的方法,两种实现比对,通过DisposableBean接口,并实现destory()方法;或者通过applicationContext.xml配置destory-method属性

    浅尝Spring注解开发_Bean生命周期及执行过程.doc

       4.BeanPostProcessor 接口 BeanPostProcessor 接口提供了一种更加灵活的方式来介入 Bean 的初始化和销毁过程。它包含两个方法: - `postProcessBeforeInitialization(Object bean, String beanName)`:在 ...

    spring配置文档[定义].pdf

    - `init-method`和`destroy-method`属性指定bean初始化和销毁时要执行的方法。例如,`personService2`在创建后会调用`init`方法,在容器关闭时调用`destory`方法。 8. **属性注入**: - `&lt;property&gt;`元素用于注入...

    Spring框架初始化解析

    2. 通过在xml中定义init-method 和 destory-method方法。 3. 通过Bean实现InitializingBean和 DisposableBean接口。 4. 写一个类,实现BeanPostProcessor接口,这个接口有两个方法:postProcessBeforeInitialization...

    Spring框架系列(13) - SpringMVC实现原理之DispatcherServlet的初始化过程.doc

    DispatcherServlet 首先是一个 Servlet,Servlet 有自己的生命周期的方法(init、destory 等),那么我们在看 DispatcherServlet 初始化时首先需要看源码中 DispatcherServlet 的类结构设计。 DispatcherServlet 的...

    Web第一个Servlet程序(生命周期、执行流程、tomcat)

    web项目:第一个Servlet程序 Servlet的生命周期:init--service--destroy、执行流程:构造器--init方法--循环[ service方法 ]--destory方法(正常关闭Tomcat)、启动tomcat测试

    Spring的自动扫描注入.docx

    Spring框架提供了自动扫描的功能,通过该功能可以自动检测并注册带有特定注解的类为Spring管理的bean,从而极大地减少了显式配置的需求。这一特性主要通过`&lt;context:component-scan&gt;`元素实现。 ##### 配置示例: ...

    利用注解配置Spring容器的方法

    @Bean(name = "user", initMethod = "init", destroyMethod = "destory") @Scope("prototype") public User getUser() { return new User("tom", 20); } ``` 在上面的例子中,我们使用@Bean注解注册了一个名为...

    Java ssm 面试题.docx

    10. Spring 容器关闭时调用 DisposableBean 的 destory() 方法; 二、Spring Bean 的作用域 在 Spring 的配置文件中,可以给 bean 加上 scope 属性来指定 bean 的作用域。常见的作用域有: 1. singleton:唯一 ...

    springmvc注解

    - **默认 Bean 名称**:如果没有显式指定 Bean 的名称,则 Spring 默认将类名首字母小写后的字符串作为 Bean 的名称。例如,对于 `VentorServiceImpl` 类,默认 Bean 名称为 `ventorServiceImpl`。 - **自定义 Bean...

    解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况

    刚开始使用的方法是:关闭导航标签,直接调用对应的页面的$destory()方法,OK,可以实现关闭页面(下次再打开该页面,将初始化)的功能,但是遇到个问题: 该页面将不再被缓存,也就是说切换导航tab时,页面将不断的...

    java学习资料java学习资料.doc

    4. **继承关系**:在ORM中,继承关系可以帮助我们将通用的属性和行为抽象到父类,子类则继承并可能扩展这些特性。这有助于减少代码重复和提高代码的可维护性。 通过Hibernate,我们可以定义这些关系,如使用`@...

    Servlet实验报告.pdf

    4. servlet 有专有的方法 init()、destory()、doGet()、doPost()。 B: 设计方案及流程: 设计一个登陆页面,用户提交后,将数据提交给 action,Servlet 来控制处理,判断用户名、密码是否正确,根据不同的结果返回...

    JAVA认证

    ### 4. 执行Java程序的方法 执行Java程序的正确方式是使用命令行工具`java`加上类名(不含`.class`扩展名),即选项B:“java FristApp”。这将调用Java虚拟机(JVM)来运行指定类的`main`方法。 - **选项解析**:...

Global site tag (gtag.js) - Google Analytics