做推广网站需要商标吗,电商网站建设期末考试,seo描述是写什么,达内网站建设文章目录 Spring Bean的生命周期实例化构造器实例化工厂方法实例化 属性赋值XML方式注解方式 初始化postProcessBeforeInitialization()和postProcessAfterInitialization()InitializingBean接口的afterPropertiesSet()方法通过Bean注解定义的初始化方法使用PostConstruct注解标… 文章目录 Spring Bean的生命周期实例化构造器实例化工厂方法实例化 属性赋值XML方式注解方式 初始化postProcessBeforeInitialization()和postProcessAfterInitialization()InitializingBean接口的afterPropertiesSet()方法通过Bean注解定义的初始化方法使用PostConstruct注解标注的初始化方法 销毁配置destroy-method方法来销毁Bean实现DisposableBean接口来销毁Bean Spring Bean的生命周期
Spring Bean的生命周期分为四个阶段实例化、属性赋值、初始化和销毁。
实例化
构造器实例化
通过Java类的构造函数实例化Bean利用Java反射机制调用bean对应类的构造方法进行实例化。
在XML文件中可以使用标签的class属性指定要实例化的Bean类。当容器启动时容器会根据class属性的全限定类名使用反射机制实例化Bean。示例代码
bean idmyBean classcom.example.MyBean/在注解方式中Component、Service、Controller等注解本质上是Java类的元数据Spring框架在启动时会扫描指定包路径下所有的类将被标注了这些注解的类通过反射机制实例化并将实例化后的对象注册到Spring容器中以供程序使用。例如
Component
public class MyBean {// class implementation
}工厂方法实例化
在Spring配置文件中可以定义一个工厂类该工厂类中有一个静态方法可以创建Bean对象并且可以指定返回值和参数Spring框架会在启动时自动调用该静态方法来创建Bean对象。这种方式类似于单例模式因为每个Bean对象只会被实例化一次并且可以在整个应用程序中共享。配置示例代码如下
bean idmyBean classcom.example.MyBeanFactory factory-methodcreateMyBean/代码如下
public class MyBeanFactory {public static MyBean createMyBean() {return new MyBean();}
}属性赋值
属性赋值是在实例化Bean后通过BeanPostProcessor接口实现对Bean的属性赋值。
XML方式
在XML文件中定义Bean以及其属性的值来配置Bean在Spring容器启动时会解析这些XML文件并根据其定义的配置创建相应的Bean实例。
以下是一个简单的 XML 配置文件示例
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd!-- 定义一个名为 person 的 Bean --bean idperson classcom.example.Personproperty namename valueJohn/property nameage value25//bean/beans上述 XML 配置文件定义了一个名为 person 的 Bean它的类为 com.example.Person并设置了 name 和 age 两个属性的值。
在 Spring 容器启动时会解析该 XML 配置文件创建一个名为 person 的 Bean 实例并将其属性值设置为 nameJohnage25。可以使用以下代码获取该 Bean
ApplicationContext context new ClassPathXmlApplicationContext(path/to/config.xml);
Person person (Person) context.getBean(person);这样就可以使用 person 对象来访问其属性值了。
注解方式
使用Autowired或Value注解进行属性赋值。这些注解的实现原理也是基于BeanPostProcessor接口实现的。
Autowired注解是根据属性的类型来进行自动注入的如果Spring容器中存在该类型的Bean则会自动将其注入到对应的属性中。如果存在多个同类型的Bean则可以使用Qualifier注解来指定要注入的Bean的名称。
好的以下是一个简单的示例
假设我们有一个接口UserService有两个实现类UserServiceA和UserServiceB
public interface UserService {void addUser(String username, String password);
}Service(userServiceA)
public class UserServiceA implements UserService {public void addUser(String username, String password) {System.out.println(User username is added by UserServiceA);}
}Service(userServiceB)
public class UserServiceB implements UserService {public void addUser(String username, String password) {System.out.println(User username is added by UserServiceB);}
}现在我们有一个需要依赖UserService的类UserController
Controller
public class UserController {Autowiredprivate UserService userService;public void addUser(String username, String password) {userService.addUser(username, password);}
}当Spring容器扫描到UserController的时候会发现它有一个属性userService需要注入然后根据该属性的类型UserService自动从容器中查找对应的Bean。由于容器中有UserServiceA和UserServiceB两个实现类所以Spring会报错无法决定要使用哪个实现类进行注入。
为了解决这个问题我们可以使用Qualifier注解将要注入的Bean的名称告诉Spring容器。例如
Controller
public class UserController {AutowiredQualifier(userServiceB)private UserService userService;public void addUser(String username, String password) {userService.addUser(username, password);}
}这样Spring容器就会自动将名称为userServiceB的UserService实现类注入到UserController的userService属性中。
Value注解则是根据属性的值来进行注入的可以使用${}或#{ }来引用配置文件中的属性值也可以直接指定一个固定的值。
Value(${jdbc.url})
private String url;通过Value注解Spring会将配置文件中名为jdbc.url的属性值注入到url属性中。
初始化
初始化是Spring Bean生命周期的第三个阶段它包括两个过程初始化前和初始化后BeanPostProcessor接口在执行初始化方法之前和之后定义了两个方法postProcessBeforeInitialization()和postProcessAfterInitialization()。
postProcessBeforeInitialization()和postProcessAfterInitialization()
postProcessBeforeInitialization()方法在执行Bean的初始化方法之前被调用可以对Bean进行自定义的前处理操作。例如可以修改Bean的属性值、增加一些代理逻辑等等。这时的Bean还没有执行初始化方法也就是说Bean还没有完全初始化。这个方法常常用于注册一些事件监听器、给Bean进行数据校验等。
postProcessAfterInitialization()方法在执行Bean的初始化方法之后被调用可以对Bean进行自定义的后处理操作。例如可以对Bean做一些额外的检查、修改某些属性值等等。这时的Bean已经执行了初始化方法并且已经完全初始化。这个方法常常用于增强Bean的能力或者为Bean提供一些额外服务如数据缓存、资源池等。
Component
public class MyBeanPostProcessor implements BeanPostProcessor {public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {//在Bean的初始化方法之前执行的自定义操作if (bean instanceof MyBean) {((MyBean)bean).setProperty(new value);//注册事件监听器if (bean instanceof MyBean) {MyBean myBean (MyBean) bean;myBean.addEventListener(new MyEventListener());}//给Bean进行数据校验if (bean instanceof MyBean) {MyBean myBean (MyBean) bean;Validator validator new MyBeanValidator();validator.validate(myBean);}}return bean;}public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {//在Bean的初始化方法之后执行的自定义操作if (bean instanceof MyBean) {//增强Bean的能力//检查if (bean instanceof MyBean) {MyBean myBean (MyBean)bean;if (myBean.getName() null) {throw new IllegalArgumentException(Name cannot be null);}}//修改某些属性值if (bean instanceof MyBean) {MyBean myBean (MyBean)bean;myBean.setProperty(new value);}//数据缓存if (bean instanceof MyBean) {MyBean myBean (MyBean)bean;CacheManager cacheMgr CacheManager.getInstance();Cache cache cacheMgr.getCache(myCache);cache.put(myBean.getId(), myBean);}//资源池if (bean instanceof MyBean) {MyBean myBean (MyBean)bean;ConnectionPool pool ConnectionPool.getInstance();myBean.setConnection(pool.getConnection());}}return bean;}
}
//实现了ApplicationListener接口并重写了onApplicationEvent方法来处理ContextRefreshedEvent事件
public class MyEventListener implements ApplicationListenerContextRefreshedEvent {Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {if (event.getSource() instanceof MyBean) {MyBean myBean (MyBean) event.getSource();System.out.println(MyBean myBean.getName() has been refreshed.);}}
}InitializingBean接口的afterPropertiesSet()方法
Spring容器在创建Bean实例之后会自动调用InitializingBean接口的afterPropertiesSet()方法完成Bean的初始化。
以下是一个实现InitializingBean接口的示例代码
import org.springframework.beans.factory.InitializingBean;public class MyBean implements InitializingBean {private String message;public void setMessage(String message) {this.message message;}Overridepublic void afterPropertiesSet() throws Exception {// 在这里初始化BeanSystem.out.println(Initializing MyBean...);System.out.println(MyBean message: message);}
}在XML配置文件中配置该Bean的属性和初始化方法
bean idmyBean classcom.example.MyBeanproperty namemessage valueHello, World!/property nameinitMethod valueafterPropertiesSet/
/bean在上面的配置中我们设置了Bean的属性message为“Hello, World!”并设置了initMethod属性为afterPropertiesSet这样在Bean创建完成后会自动调用MyBean实现的afterPropertiesSet()方法完成Bean的初始化。
除了实现InitializingBean接口还可以通过Bean注解中的initMethod属性或者使用PostConstruct注解标注的初始化方法。示例代码
通过Bean注解定义的初始化方法
Configuration
public class AppConfig {Bean(initMethod init)public MyBean myBean() {return new MyBean();}
}public class MyBean {public void init() {// initialization code}
}使用PostConstruct注解标注的初始化方法
public class MyBean {PostConstructpublic void init() {// initialization code}
}销毁
销毁是Spring Bean生命周期的最后一个阶段它是通过实现DisposableBean接口或通过配置destroy-method方法来实现。实现DisposableBean接口需要实现destroy()方法该方法会在Bean销毁前被调用。在容器关闭之前Spring会先销毁Bean并回调Bean的destroy()方法。
配置destroy-method方法来销毁Bean
在XML文件中可以使用destroy-method属性指定Bean的销毁方法。Spring容器会在销毁Bean之前调用这个方法。
bean idexampleBean classcom.example.ExampleBean destroy-methodcleanupproperty namename valueJohn /
/bean在上面的代码中ExampleBean类有一个名为cleanup的方法它将在Bean销毁时被调用。在XML文件中通过配置destroy-method属性来指定销毁方法。
实现DisposableBean接口来销毁Bean
通过实现DisposableBean接口Bean类可以在调用destroy()方法之前实现销毁操作。该方法会在Bean销毁之前调用。销毁的具体过程可以自定义实现。在销毁Bean之前需要先关闭应用上下文释放Bean占用的资源。
public class ExampleBean implements DisposableBean {private String name;public void setName(String name) {this.name name;}Overridepublic void destroy() throws Exception {System.out.println(Cleaning up resources for name);}
}在上面的代码中ExampleBean类实现了DisposableBean接口并重写了destroy()方法。在该方法中可以自定义销毁Bean的逻辑。在Bean销毁之前Spring容器会回调该方法。