您的位置:首页 > 编程语言 > Java开发

Spring中Bean的生命周期

2015-11-29 13:31 519 查看
#准备工作
最近刚开始看韩顺平老师讲的Spring基础,感觉听起来还是感觉比较好,也就教程中的案例做了实践,接下来记录一下,Spring中Bean的生命周期。
Spring的下载地址(我使用的是3.2.4):http://repo.springsource.org/libs-release-local/org/springframework/spring/

①创建工程
首先,用IDE创建一个Java工程,在工程目录下创建lib目录,复制需要引用的jar包并添加到ClassPath,因为我用的是Intellij,可能操作上与Eclipse有些不同。
②添加项目依赖Jar包
这个版本和教程中讲的2.5.5也有差异,主要是下载来的jar包中没有一个完整的包可以引用,只有一个个分开的jar包,这就使没有接触过Spring的我有些迷茫,
因为包很多,不知道哪些需要哪些不需要,查了一下资料,说是引用spring-core-3.2.4.RELEASE和spring-beans-3.2.4.RELEASE就够了,但是经过实践,还
需要引入spring-context-3.2.4.RELEASE、spring-expression-3.2.4.RELEASE和写日志的包commons-logging-1.1.1(需要单独下载)。
结论(需要引用的Jar包):
spring-core-3.2.4.RELEASE | spring-beans-3.2.4.RELEASE | spring-context-3.2.4.RELEASE | spring-expression-3.2.4.RELEASE | commons-logging-1.1.1
③创建applicationContext.xml文件
到这一步又开始迷茫了,搜索一下找到复制过来,Intellij检查到没有使用的引用都是灰色的,所以就删除了未使用的,结果为:

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>


④创建类文件
User.java

package com.spring.pojo;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class User implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {

private String name;
// private String gender;
// private Work service;

public User() {
System.out.println("①Constructor -> invoked");
}

public User(String name) {// , String gender, Work service) {
this.name = name;
// this.gender = gender;
// this.service = service;
}

public String getName() {
return name;
}

public void setName(String name) {
System.out.println("①setName -> invoked");
this.name = name;
}

/**
public String getGender() {
return gender;
}

public void setGender(String gender) {
this.gender = gender;
}

public Work getService() {
return service;
}

public void setService(Work service) {
this.service = service;
}
*/

/**
* init-method
*/
public void initBean() {
System.out.println("①initBean -> invoked");
}

public void show() {
System.out.println("①" + this.name); // + ":" + this.gender + "\r\n" + service.getStatus());
}

@Override
public void setBeanName(String s) {
System.out.println("①" + s);
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("①" + applicationContext);
}

@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("①" + beanFactory);
Work workService = (Work) beanFactory.getBean("work");
String status = workService.getStatus();
System.out.println("②" + status);
}

@Override
public void afterPropertiesSet() throws Exception {
System.out.println("①afterPropertiesSet -> invoked");
}

@Override
public void destroy() throws Exception {
System.out.println("①DisposableBean's destroy -> invoked");
}

public void beforeDestroy() {
System.out.println("①beforeDestroy -> invoked");
}
}


Work.java

package com.spring.pojo;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class Work implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {

public String name;
public String age;

public Work() {
System.out.println("②Constructor -> invoked");
}

public Work(String name, String age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
System.out.println("②setName -> invoked");
this.name = name;
}

public String getAge() {
return age;
}

public void setAge(String age) {
this.age = age;
}

public String getStatus() {
return this.name + ":" + this.age;
}

public void initMethod() {
System.out.println("②initMethod -> invoked");
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("②" + applicationContext);
}

@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("②" + beanFactory);
}

@Override
public void setBeanName(String s) {
System.out.println("②" + s);
}

@Override
public void destroy() throws Exception {
System.out.println("②destroy -> invoked");
}

@Override
public void afterPropertiesSet() throws Exception {
System.out.println("②afterPropertiesSet");
}

public void destroyMethod() {
System.out.println("②destroyMethod -> invoked");
}
}


BeanProcessor.java

package com.spring.pojo;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class BeanProcessor implements BeanPostProcessor {

@Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
System.out.println("postProcessBeforeInitialization -> invoked");
return o;
}

@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("postProcessAfterInitialization -> invoked");
return o;
}
}


UserTest.java

package com.spring.pojo;

import com.spring.pojo.User;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserTest {

public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User service = (User) context.getBean("user");
service.show();
}
}


applicationContext.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"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="user" class="com.spring.pojo.User"
scope="prototype"
init-method="initBean" destroy-method="beforeDestroy">
<property name="name" value="祁连山"/>
<!-- <property name="gender" value="男"/>
<property name="service" ref="workService"/> -->
</bean>

<bean id="work" class="com.spring.pojo.Work"
scope="prototype">
<property name="name" value="android开发"/>
<property name="age" value="三年"/>
</bean>

<bean id="beanProcessor" class="com.spring.pojo.BeanProcessor"/>
</beans>


⑤测试结果:
①Constructor -> invoked
①setName -> invoked
①user
①org.springframework.beans.factory.support.DefaultListableBeanFactory@3fcd000a: defining beans [user,work,beanProcessor]; root of factory hierarchy
②Constructor -> invoked
②setName -> invoked
②work
②org.springframework.beans.factory.support.DefaultListableBeanFactory@3fcd000a: defining beans [user,work,beanProcessor]; root of factory hierarchy
②org.springframework.context.support.ClassPathXmlApplicationContext@7c4633e7: startup date [Sun Nov 29 13:26:05 CST 2015]; root of context hierarchy
postProcessBeforeInitialization -> invoked
②afterPropertiesSet
postProcessAfterInitialization -> invoked
②android开发:三年
①org.springframework.context.support.ClassPathXmlApplicationContext@7c4633e7: startup date [Sun Nov 29 13:26:05 CST 2015]; root of context hierarchy
postProcessBeforeInitialization -> invoked
①afterPropertiesSet -> invoked
①initBean -> invoked
postProcessAfterInitialization -> invoked
①祁连山
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: