手机网站微信登陆,动漫设计专业好就业吗,wordpress视频无法播放视频,本地wordpress数据SpringBean的生命周期
SperingBean的生命周期是从Bean实例化之后#xff0c;即通过反射创建出对象之后#xff0c;到Bean成为一个完整对象#xff0c;最终存储到单例池中#xff0c;这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体上分为三个阶段 Bean的…SpringBean的生命周期
SperingBean的生命周期是从Bean实例化之后即通过反射创建出对象之后到Bean成为一个完整对象最终存储到单例池中这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体上分为三个阶段 Bean的实例化阶段Spring框架会取出BeanDefiniton的信息进行判断当前Bean的范围是否是singleton的是否不是延迟加载的是否不是FactoryBean等最终将一个普通的singleton的Bean通过反射加载类进行实例化Bean的初始化阶段着重研究Bean创建之后还仅仅是个半成品还需要对Bean实例的属性进行填充、执行一些Aware接口方法、执行BeanPostProcessor方法执行InitializingBean接口的初始化方法、执行自定义初始化init方法等。该阶段是Spring最具有技术含量和复杂程度的阶段AOP增强功能后面学习的Spring的注解功能等、spring高频面试题Bean的循环引用问题都是在这个阶段体现的Bean的完成阶段经过初始化阶段Bean就成为了一个完整的Spring Bean被存储到单例池singletonObjects中即完成了Spring Bean的整个生命周期。
Spring Bean的初始化阶段涉及过程
Bean实例属性的填充Aware接口属性的注入BeanPostProcessor的before方法回调InitializingBean接口的初始化方法回调自定义初始化方法init回调BeanPostProcessor的after方法回调
Bean实例属性填充
BeanDefinition中对当前Bean实体的注入信息通过属性propertyValue进行了储存例如UserService的属性信息如下 bean iduserService classcom.example.Service.Impl.UserServiceImplproperty nameuserDAO refuserDAO/propertyproperty namename valuehhhh/property/beanbean nameuserDAO classcom.example.DAO.Impl.UserDAOImpl/bean
属性注入的三种情况
注入普通属性Stringint或存储基本类型的集合时直接通过set方法反射设置进去 上述属性name对应类中的set方法注入单向对象引用属性时从容器中getBean获取后通过set方法反射设置进去如果容器中没有则先创建被注入对象Bean实例完成整个生命周期后再进行注入操作 上述UserDAO属性的注入根据配置文件中bean的位置不同进行的顺序也不一样主要代码如下UserServiceImpl类 package com.example.Service.Impl;import com.example.DAO.UserDAO;
import com.example.Service.UserService;public class UserServiceImpl implements UserService {public UserServiceImpl() {System.out.println(UserService对象创建);}private UserDAO userDAO;private String name;public void setName(String name) {this.name name;}public void setUserDAO(UserDAO userDAO) {System.out.println(UserService执行注入UserDAO的操作:setDAO方法);this.userDAO userDAO;}Overridepublic void show() {System.out.println(show~~~);}
}UserDAOImpl类 package com.example.DAO.Impl;import com.example.DAO.UserDAO;public class UserDAOImpl implements UserDAO {public UserDAOImpl() {System.out.println(UserDAO对象创建);}
}测试类 package com.example.Test;import com.example.Service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestApplicationContext {public static void main(String[] args) {ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext(application.xml);UserService UserServiceBean (UserService) context.getBean(UserService.class);}
} 若配置文件中先创建UserADO的bean对象 ?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.xsdbean classcom.example.PostProcessor.TimeLogBeanPostProcessor/bean!-- bean iduserService classcom.example.Service.Impl.UserServiceImpl--!-- /bean--!-- bean iduserDAO classcom.example.DAO.Impl.UserDAOImpl--!-- /bean--!-- alias nameuserDAO aliasxxx/--!-- alias nameuserDAO aliasyyy/--bean nameuserDAO classcom.example.DAO.Impl.UserDAOImpl/beanbean iduserService classcom.example.Service.Impl.UserServiceImplproperty nameuserDAO refuserDAO/propertyproperty namename valuehhhh/property/bean/beans 测试类运行结果为 若配置文件中先创建UserService的bean对象 ?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.xsdbean classcom.example.PostProcessor.TimeLogBeanPostProcessor/bean!-- bean iduserService classcom.example.Service.Impl.UserServiceImpl--!-- /bean--!-- bean iduserDAO classcom.example.DAO.Impl.UserDAOImpl--!-- /bean--!-- alias nameuserDAO aliasxxx/--!-- alias nameuserDAO aliasyyy/--bean iduserService classcom.example.Service.Impl.UserServiceImplproperty nameuserDAO refuserDAO/propertyproperty namename valuehhhh/property/beanbean nameuserDAO classcom.example.DAO.Impl.UserDAOImpl/bean/beans 运行结果如下 注入双向对象引用属性时就比较复杂了涉及循环引用循环依赖问题下面会详细阐释解决方案。明天再来女朋友来了不能学习了p51