志在指尖
用双手敲打未来

Bean的生命周期,作用域,装配总结

一、安装方法
Bean的概念:Spring结构办理的应用程序中,由Spring容器担任创立,安装,设置特点,进而办理整个生命周期的目标,称为Bean目标。
1、XML格式安装
Spring最传统的Bean的办理方法。
装备方法
“userInfo”class=”com.spring.mvc.entity.UserInfo”><propertyname=”name”value=”cicada”/>bean>
测验代码
ApplicationContextcontext01=newClassPathXmlApplicationContext(“/bean-scan-02.xml”);
UserInfouserInfo=(UserInfo)context01.getBean(“userInfo”);
System.out.println(userInfo.getName());java
2、注解扫描
在实际开发中:一般运用注解取代xml装备文件。
常见注解
@Component<==>”Class”>@Component(“id”)<==>”id”class=”Class”>@Repository:Mvc架构中Dao层Bean的注解@Service:Mvc架构中Service层Bean的注解@Controller:Mvc架构中Controller层Bean的注解
运用案例
//1、注解代码块@Component(“infoService”)publicclassInfoServiceImplimplementsInfoService{@OverridepublicvoidprintName(Stringname){
System.out.println(“Name:”+name);
}
}//2、装备代码块@ComponentScan//组件扫描注解publicclassBeanConfig{
}
测验代码
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes=BeanConfig.class)
publicclassTest01{@AutowiredprivateInfoServiceinfoService;@Testpublicvoidtest1(){infoService.printName(“cicada”);System.out.println(infoService==infoService);
}
}
3、XML装备扫描
上面运用ComponentScan注解,也可在装备文件进行一致的装备,效果相同,还简化代码。
<context:component-scanbase-package=”com.spring.mvc”/>
4、Java代码安装
这种依据Configuration注解,办理Bean的创立,在SpringBoot和SpringCloud的结构中,非常常见。
装备类代码
@Configuration//装备类注解publicclassUserConfig{@BeanpublicUserInfouserInfo(){
System.out.println(“userInfo…”);returnnewUserInfo();
}
}
测验代码
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes=UserConfig.class)
publicclassTest03{@AutowiredprivateUserInfouserInfo;@AutowiredprivateUserInfouserInfo1;@Testpublicvoidtest1(){/*
*userInfo…
*true
*/System.out.println(userInfo==userInfo1);
}
}
二、特点值设置
上面是Bean的安装几种常见方法,下面来看看Bean特点值设置,这儿就依据Xml装备的方法。
1、根底类型和调集
装备代码
<beanid=”emp1″class=”com.spring.mvc.entity.Employee”><propertyname=”name”value=”cicada”/><propertyname=”id”value=”1″/>bean><beanid=”emp2″class=”com.spring.mvc.entity.Employee”><propertyname=”name”value=”smile”/><propertyname=”id”value=”2″/>bean><beanid=”department”class=”com.spring.mvc.entity.Department”><propertyname=”name”value=”IT部分”/><propertyname=”empName”><list><value>empName1value><value>empName2value><value>empName3value>list>property><propertyname=”empList”><list><refbean=”emp1″/><refbean=”emp2″/><refbean=”emp1″/>list>property><propertyname=”empSet”><set><refbean=”emp1″/><refbean=”emp2″/><refbean=”emp1″/>set>property><propertyname=”empMap”><map><entrykey=”1″value-ref=”emp1″/><entrykey=”2″value-ref=”emp2″/><entrykey=”2″value-ref=”emp1″/>map>property><propertyname=”pp”><props><propkey=”pp1″>Helloprop><propkey=”pp2″>Worldprop>props>property>bean>
测验代码
publicclassTest05{
@Testpublicvoidtest01(){
ApplicationContextcontext=newClassPathXmlApplicationContext(“/bean-value-03.xml”);
Departmentdepartment=(Department)context.getBean(“department”);
System.out.println(department.getName());
System.out.println(“———————>String数组”);for(Stringstr:department.getEmpName()){
System.out.println(str);
}
System.out.println(“———————>List调集”);for(Employeesmp:department.getEmpList()){
System.out.println(smp.getId()+”:”+smp.getName());
}
System.out.println(“———————>Set调集”);for(Employeeemp:department.getEmpSet()){
System.out.println(emp.getId()+”:”+emp.getName());
}
System.out.println(“———————>Map调集”);for(Map.Entryentry:department.getEmpMap().entrySet()){
System.out.println(entry.getKey()+”:”+entry.getValue().getName());
}
System.out.println(“———————>Properties”);
Propertiespp=department.getPp();
System.out.println(pp.get(“pp1”));
System.out.println(pp.get(“pp2″));
}
}
2、装备结构函数
依据装备的参数个数和类型,去映射并加载Bean的结构方法。
装备代码
<beanid=”employee”class=”com.spring.mvc.entity.Employee”><constructor-argindex=”0″type=”java.lang.String”value=”cicada”/><constructor-argindex=”1″type=”int”value=”1″/>bean>
测验代码
publicclassTest06{@Testpublicvoidtest01(){
ApplicationContextcontext=newClassPathXmlApplicationContext(“/bean-value-04.xml”);
Employeeemployee=(Employee)context.getBean(“employee”);
System.out.println(employee.getId()+”:”+employee.getName());
}
}
3、装备承继联系
装备代码
<beanid=”student”class=”com.spring.mvc.entity.Student”><propertyname=”name”value=”Spring”/><propertyname=”age”value=”22″/>bean><beanid=”grade”class=”com.spring.mvc.entity.Grade”><propertyname=”name”value=”Summer”/><propertyname=”degree”value=”大学”/>bean>
测验代码
publicclassTest07{@Testpublicvoidtest01(){
ApplicationContextcontext=newClassPathXmlApplicationContext(“/bean-value-05.xml”);
Gradegrade=(Grade)context.getBean(“grade”);/*Summer;0;大学*/System.out.println(grade.getName()+”;”+grade.getAge()+”;”+grade.getDegree());
}
}
三、效果域
效果域:用于确认spring创立bean实例个数,比如单例Bean,原型Bean,等等。
类型阐明
singletonIOC容器仅创立一个Bean实例,IOC容器每次回来的是同一个单例Bean实例,默许装备。
prototypeIOC容器能够创立多个Bean实例,每次回来的Bean都是新的实例。
request每次HTTP恳求都会创立一个新的Bean,适用于WebApplicationContext环境。
session同一个HTTPSession同享一个Bean实例。不同HTTPSession运用不同的实例。
global-session同session效果域不同的是,所有的Session同享一个Bean实例。
四、生命周期
在Spring结构中Bean的生命周期非常复杂,进程大致如下:实例化,特点加载,初始化前后办理,毁掉等。下面依据一个案例装备,会更加的清楚。
1、编写BeanLife类
publicclassBeanLifeimplementsBeanNameAware{privateStringname;publicStringgetName(){returnname;
}publicvoidsetName(Stringname){
System.out.println(“设置称号:”+name);this.name=name;
}
@OverridepublicvoidsetBeanName(Stringvalue){
System.out.println(“BeanNameAware..SetName:”+value);
}publicvoidinitBean(){
System.out.println(“初始化Bean..”);
}publicvoiddestroyBean(){
System.out.println(“毁掉Bean..”);
}publicvoiduseBean(){
System.out.println(“运用Bean..”);
}
@OverridepublicStringtoString(){return”BeanLife[name=”+name+”]”;
}
}
2、定制加载进程
实现BeanPostProcessor接口。
publicclassBeanLifePostProcessorimplementsBeanPostProcessor{//初始化之前对bean进行增强处理@OverridepublicObjectpostProcessBeforeInitialization(Objectobj,StringbeanName)throwsBeansException{
System.out.println(“初始化之前…”+beanName);returnobj;
}//初始化之后对bean进行增强处理@OverridepublicObjectpostProcessAfterInitialization(Objectobj,StringbeanName)throwsBeansException{
System.out.println(“初始化之后…”+beanName);//改写Bean的称号if(objinstanceofBeanLife){
BeanLifebeanLife=(BeanLife)obj;
beanLife.setBeanName(“myBeanLifeTwo”);returnbeanLife;
}returnobj;
}
}
3、装备文件
<beanclass=”com.spring.mvc.BeanLifePostProcessor”/><beanid=”beanLife”class=”com.spring.mvc.entity.BeanLife”init-method=”initBean”destroy-method=”destroyBean”><propertyname=”name”value=”myBeanLifeOne”/>bean>
4、测验进程
测验代码
publicclassTest08{@Testpublicvoidtest01(){
ApplicationContextcontext=newClassPathXmlApplicationContext(“/bean-value-06.xml”);
BeanLifebeanLife=(BeanLife)context.getBean(“beanLife”);
System.out.println(“测验成果BeanLife:”+beanLife.getName());
beanLife.useBean();//封闭容器((AbstractApplicationContext)context).close();
}
}
输出成果
1、设置称号:myBeanLifeOne2、BeanNameAware..SetName:beanLife3、初始化之前…beanLife4、初始化Bean..
5、初始化之后…beanLife6、BeanNameAware..SetName:myBeanLifeTwo7、测验成果BeanLife:myBeanLifeOne8、运用Bean..
9、毁掉Bean..
这儿整理Bean的生命周期,进程非常清晰。

未经允许不得转载:IT技术网站 » Bean的生命周期,作用域,装配总结
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载