浅谈spring ioc的注入方式及注入不同的数据类型
关于Spring-IoC的简单使用参考:
springioc的简单实例及bean的作用域属性解析
1、通过set方法注入不同数据类型
测试类代码(set方式注入的属性一定要加set方法)
/**通过set方法注入示例*/ publicclassIoC_By_Set{ /**注入Integer类型参数*/ privateIntegerid; /**注入String类型参数*/ privateStringname; /**注入实体Bean*/ privateUseruser; /**注入数组*/ privateObject[]array; /**注入List集合*/ privateList
applicationContext.xml配置
array01 array02 array03
list01 list02 list03 set01 set02 set03 propValue1 propValue2
测试代码
publicclassIoC_Test{ privateApplicationContextctx; @Before publicvoidload(){ //读取applicationContext.xml配置文件 ctx=newClassPathXmlApplicationContext("applicationContext.xml"); } @Test publicvoidSetTest(){ IoC_By_Setioc=(IoC_By_Set)ctx.getBean("ioC_By_Set"); ioc.checkAttr(); } }
控制台结果:
id:1 -------------------------- name:P&G -------------------------- Bean:1|内部Bean|233 -------------------------- array: array01 array02 array03 -------------------------- list: list01 list02 list03 -------------------------- set: set01 set02 set03 -------------------------- map: mapKey01|mapValue01 mapKey02|mapValue02 -------------------------- properties: propKey2|propValue2 propKey1|propValue1 -------------------------- -------------------------- -------------------------- 全部正确!!!
2、通过构造方法注入各种类型属性
注意:使用JDK1.8版本请将spring相关jar包升级到4.x版本以上,否则不兼容构造方法注入
测试类代码
/**通过构造方法注入示例*/ publicclassIoC_By_Constructor{ privateIntegerid; privateStringname; privateUseruser; privateListlist; publicIoC_By_Constructor(){ } publicIoC_By_Constructor(Integerid,Stringname,Useruser, List list){ this.id=id; this.name=name; this.user=user; this.list=list; } /**检查是否注入成功*/ publicBooleancheckAttr(){ if(id==null){ returnfalse; }else{ System.out.println("id:"+id); } System.out.println("----------------------------"); if(name==null){ returnfalse; }else{ System.out.println("name:"+name); } System.out.println("----------------------------"); if(user==null){ returnfalse; }else{ System.out.println("user:"+user.getId()+"|"+ user.getUserName()+"|"+user.getPassWord()); } System.out.println("----------------------------"); if(list==null){ returnfalse; }else{ System.out.println("list:"); for(Objectobject:list){ System.out.println(object.toString()); } } System.out.println("----------------------------"); System.out.println("全部正确!!!"); returntrue; } }
applicationContext.xml配置
list01 list02 list03
测试代码:
publicclassIoC_Test{ privateApplicationContextctx; @Before publicvoidload(){ //读取applicationContext.xml配置文件 ctx=newClassPathXmlApplicationContext("applicationContext.xml"); } @Test publicvoidconstructorTest(){ IoC_By_Constructorioc=(IoC_By_Constructor)ctx.getBean("ioC_By_Constructor"); ioc.checkAttr(); } }
控制台结果:
id:1 ---------------------------- name:P&G ---------------------------- user:1|构造内部Bean|666 ---------------------------- list: list01 list02 list03 ---------------------------- 全部正确!!!
3、自动注入(自动装配)
自动装配虽然能节省一些代码但是不推荐使用
测试类代码:
/**自动装配注入*/ publicclassIoC_By_Auto{ privateUseruser; /**检查是否注入成功*/ publicBooleancheckAttr(){ if(user==null){ returnfalse; }else{ System.out.println("user:"+user.getId()+"|"+ user.getUserName()+"|"+user.getPassWord()); } System.out.println("正确!!!"); returntrue; } /**自动装配的属性需要设置set方法*/ publicvoidsetUser(Useruser){ this.user=user; } }
applicationContext.xml配置
测试代码
publicclassIoC_Test{ privateApplicationContextctx; @Before publicvoidload(){ //读取applicationContext.xml配置文件 ctx=newClassPathXmlApplicationContext("applicationContext.xml"); } @Test publicvoidAutoTest(){ IoC_By_Autoioc=(IoC_By_Auto)ctx.getBean("ioC_By_Auto"); ioc.checkAttr(); } }
控制台结果
user:1|自动装配|233 正确!!!
以上使用的是byName模式,其他模式配置代码已经注明,不做测试。
4、使用P命名空间注入属性
测试类代码
/**使用P命名空间注入*/ publicclassIoC_By_P{ privateIntegerid; privateStringname; privateUseruser; /**检查是否注入成功*/ publicBooleancheckAttr(){ if(id==null){ returnfalse; }else{ System.out.println("id:"+id); } System.out.println("----------------------------"); if(name==null){ returnfalse; }else{ System.out.println("name:"+name); } System.out.println("----------------------------"); if(user==null){ returnfalse; }else{ System.out.println("user:"+user.getId()+"|"+ user.getUserName()+"|"+user.getPassWord()); } System.out.println("----------------------------"); System.out.println("全部正确!!!"); returntrue; } //使用P命名空间注入属性需要设置set方法 publicvoidsetId(Integerid){ this.id=id; } publicvoidsetName(Stringname){ this.name=name; } publicvoidsetUser(Useruser){ this.user=user; } }
applicationContext.xml配置
测试代码
publicclassIoC_Test{ privateApplicationContextctx; @Before publicvoidload(){ //读取applicationContext.xml配置文件 ctx=newClassPathXmlApplicationContext("applicationContext.xml"); } @Test publicvoidPTest(){ IoC_By_Pioc=(IoC_By_P)ctx.getBean("ioC_By_P"); ioc.checkAttr(); } }
控制台结果
id:1 ---------------------------- name:命名空间 ---------------------------- user:1|P|233 ---------------------------- 全部正确!!!
5、使用注解方式注入
Spring在3.0以后,提供了基于Annotation(注解)的注入。
1.@Autowired-对成员变量、方法和构造函数进行标注,来完成自动装配的工作,不推荐使用
2.@Qualifier-配合@Autowired来解决装配多个同类型的bean
3.@Resource-JSR-250标准注解,作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按byName自动注入
4.@PostConstruct-在方法上加上注解@PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行
5.@PreDestroy-在方法上加上注解@PreDestroy,这个方法就会在Bean初始化之后被Spring容器执行
6.@Component-只需要在对应的类上加上一个@Component注解,就将该类定义为一个Bean,不推荐使用,推荐使用更加细化的三种:@Repository、@Service、@Controller
@Repository存储层Bean
@Service业务层Bean
@Controller展示层Bean
7.@Scope-定义Bean的作用范围
首先配置applicationContext.xml开启注解
实体Bean加注解
@Repository publicclassUser{ privateIntegerid=1; privateStringuserName="注解注入"; privateStringpassWord="233"; publicUser(){ super(); } publicUser(Integerid,StringuserName,StringpassWord){ super(); this.id=id; this.userName=userName; this.passWord=passWord; } publicIntegergetId(){ returnid; } publicStringgetUserName(){ returnuserName; } publicStringgetPassWord(){ returnpassWord; } publicvoidsetId(Integerid){ this.id=id; } publicvoidsetUserName(StringuserName){ this.userName=userName; } publicvoidsetPassWord(StringpassWord){ this.passWord=passWord; } }
测试类代码加注解
/**使用注解注入属性*/ @Service("ioC_By_Annotation") publicclassIoC_By_Annotation{ @Resource privateUseruser; publicvoidsetUser(Useruser){ this.user=user; } /**检查是否注入成功*/ publicBooleancheckAttr(){ if(user==null){ returnfalse; }else{ System.out.println("user:"+user.getId()+"|"+ user.getUserName()+"|"+user.getPassWord()); } System.out.println("正确!!!"); returntrue; } }
测试代码
publicclassIoC_Test{ privateApplicationContextctx; @Before publicvoidload(){ //读取applicationContext.xml配置文件 ctx=newClassPathXmlApplicationContext("applicationContext.xml"); } @Test publicvoidannotationTest(){ IoC_By_Annotationioc=(IoC_By_Annotation)ctx.getBean("ioC_By_Annotation"); ioc.checkAttr(); } }
控制台输出
经测试使用注解注入如果applicationContext.xml配置有其他注入方式会报错,也会导致其他注入方式异常。
user:1|注解注入|233 正确!!!
6、通过配置静态工厂方法Bean注入
静态工厂代码
/**静态工厂*/ publicclassStaticFactory{ publicstaticIntegergetId(){ return1; } publicstaticStringgetName(){ return"静态工厂"; } publicstaticUsergetUser(){ returnnewUser(1,"工厂User","666"); } }
测试类代码
/**通过静态工厂方式注入*/ publicclassIoC_By_StaticFactory{ privateIntegerid; privateStringname; privateUseruser; /**检查是否注入成功*/ publicBooleancheckAttr(){ if(id==null){ returnfalse; }else{ System.out.println("id:"+id); } System.out.println("----------------------------"); if(name==null){ returnfalse; }else{ System.out.println("name:"+name); } System.out.println("----------------------------"); if(user==null){ returnfalse; }else{ System.out.println("user:"+user.getId()+"|" +user.getUserName()+"|"+user.getPassWord()); } System.out.println("----------------------------"); System.out.println("全部正确!!!"); returntrue; } /**需要为需要注入的属性设置set方法*/ publicvoidsetId(Integerid){ this.id=id; } publicvoidsetName(Stringname){ this.name=name; } publicvoidsetUser(Useruser){ this.user=user; } }
applicationContext.xml配置
测试代码
publicclassIoC_Test{ privateApplicationContextctx; @Before publicvoidload(){ //读取applicationContext.xml配置文件 ctx=newClassPathXmlApplicationContext("applicationContext.xml"); } @Test publicvoidstaticFactoryTest(){ IoC_By_StaticFactoryioc=(IoC_By_StaticFactory)ctx.getBean("ioC_By_StaticFactory"); ioc.checkAttr(); } }
控制台输出结果
id:1 ---------------------------- name:静态工厂 ---------------------------- user:1|工厂User|666 ---------------------------- 全部正确!!!
7、通过实例工厂方法注入
与静态工厂区别在于实例工厂不是静态的,需要先new一个实例工厂对象,才可以配置其方法,而new的这个对象也由spring来管理
工厂代码
/**实例工厂*/ publicclassFactory{ publicIntegergetId(){ return1; } publicStringgetName(){ return"实例工厂"; } publicUsergetUser(){ returnnewUser(1,"实例工厂User","233"); } }
测试类代码
/**实例工厂注入*/ publicclassIoC_By_Factory{ privateIntegerid; privateStringname; privateUseruser; /**检查是否注入成功*/ publicBooleancheckAttr(){ if(id==null){ returnfalse; }else{ System.out.println("id:"+id); } System.out.println("----------------------------"); if(name==null){ returnfalse; }else{ System.out.println("name:"+name); } System.out.println("----------------------------"); if(user==null){ returnfalse; }else{ System.out.println("user:"+user.getId()+"|" +user.getUserName()+"|"+user.getPassWord()); } System.out.println("----------------------------"); System.out.println("全部正确!!!"); returntrue; } /**需要为需要注入的属性设置set方法*/ publicvoidsetId(Integerid){ this.id=id; } publicvoidsetName(Stringname){ this.name=name; } publicvoidsetUser(Useruser){ this.user=user; } }
applicationContext.xml配置
测试类代码
publicclassIoC_Test{ privateApplicationContextctx; @Before publicvoidload(){ //读取applicationContext.xml配置文件 ctx=newClassPathXmlApplicationContext("applicationContext.xml"); } @Test publicvoidfactoryTest(){ IoC_By_Factoryioc=(IoC_By_Factory)ctx.getBean("ioC_By_Factory"); ioc.checkAttr(); } }
控制台输出
id:1 ---------------------------- name:实例工厂 ---------------------------- user:1|实例工厂User|233 ---------------------------- 全部正确!!!
总结
以上就是本文关于浅谈springioc的注入方式及注入不同的数据类型的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!