博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring IOC 依赖注入的几种方式
阅读量:6370 次
发布时间:2019-06-23

本文共 3588 字,大约阅读时间需要 11 分钟。

一 setter方法注入

配置文件如下:

<bean id="helloAction" class="org.yoo.action.SpringSetterHelloAction"> <!-- setter injection using the nested <ref/> element --> <property name="helloservice"><ref bean="helloService"/></property> <!--可以不设置类型 --> <property name="name" value="yoo"></property> </bean>

action实现类中代码:

private IHelloService helloservice; private String name ; public void sayHello(){ helloservice.sayHello(); System.out.println(this.name); }

public void setHelloservice(IHelloService helloservice) { this.helloservice = helloservice; }

public void setName(String name) { this.name = name; }

这里的name和helloservice都采用属性的setter方法注入。即类中设置一个全局属性,并对属性有setter方法,以供容器注入。

二 构造器注入

spring也支持构造器注入,也即有些资料中的构造子或者构造函数注入。

先看配置文件:

<!--普通构造器注入--> <bean id="helloAction" class="org.yoo.action.ConstructorHelloAction"> <!--type 必须为java.lang.String 因为是按类型匹配的,不是按顺序匹配-->

<constructor-arg type="java.lang.String" value="yoo"/> <!-- 也可以使用index来匹配--> <!--<constructor-arg index="1" value="42"/>--> <constructor-arg><ref bean="helloService"/></constructor-arg> </bean>

action实现类中代码:

private HelloServiceImpl helloservice; private String name ;

public SpringConstructorHelloAction(HelloServiceImpl helloservice,String name){ this.helloservice = helloservice; this.name = name ; }

@Override public void sayHello() { helloservice.sayHello(); System.out.println(this.name); }

同样设置2个属性,然后在构造函数中注入。

三静态工厂注入

配置文件如下:

<!--静态工厂构造注入-->

<!--注意这里的class 带factory-method参数-->

<!--factory-method的值是FactoryHelloAction中的工厂方法名createInstance--> <bean id="helloAction" class="org.yoo.di.FactoryHelloAction" factory-method="createInstance"> <constructor-arg type="java.lang.String" value="yoo"/> <constructor-arg><ref bean="helloService"/></constructor-arg> </bean>

action实现类:

private HelloServiceImpl helloservice; private String name = null;

private SpringFactoryHelloAction(String name ,HelloServiceImpl helloservice){ this.helloservice = helloservice ; this.name = name ; }
public static SpringFactoryHelloAction createInstance(String name ,HelloServiceImpl helloservice) { SpringFactoryHelloAction fha = new SpringFactoryHelloAction (name,helloservice); // some other operations return fha; }

@Override public void sayHello() { helloservice.sayHello(); System.out.println(this.name); } 四 无配置文件注入(自动注入)

上面三种方法都需要编写配置文件,在spring2.5中还提供了不编写配置文件的ioc实现。需要注意的是,无配置文件指bean之间依赖,不基于配置文件,而不是指没有spring配置文件。

配置文件如下:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="" xmlns:xsi="" xsi:schemaLocation=" "> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> <bean id="helloService" class="org.yoo.service.HelloServiceImpl"> </bean> <bean id="helloAction" class="org.yoo.action.AutowiredHelloAction"> </bean> </beans>

可见上面只是设置了helloService和helloAction两个bean,并没有设置helloAction对helloService的依赖。

另外<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>是必须的,有此才支持自动注入。

action实现类:

/* * 属性自动装载 */ /* @Autowired private HelloService helloservice;

@Override public void sayHello() { helloservice.sayHello(); 。 上面代码很简单,在属性上加上 @Autowired注释,spring会自动注入HelloService 。

同样也支持构造器和setteer方法的注入,如下:

构造器自动注入:

/* * 还可以使用构造函数设置 */ @Autowired public SpringAutowiredHelloAction(HelloServiceImpl helloservice){ this.helloservice = helloservice; }

setter方法自动注入:

/* * 也可以使用set方法设置 */ /* @Autowired public void setHelloservice(HelloService helloservice) { this.helloservice = helloservice; }

最后在spring的reference文档中有提到,如果不使用自动注入,尽量使用setter方法,一般通用的也是使用setter方法。

而使用自动注入还是配置文件方式,如果jdk低于1.5或者spring不是2.5,就只能够使用配置文件方式了。其它的就看实际项目选择了。

转载于:https://www.cnblogs.com/zj45320670/p/3148958.html

你可能感兴趣的文章
2.Python基础
查看>>
第二十一讲 任务的删除
查看>>
园区网络搭建
查看>>
Tengine动态模块扩展
查看>>
HanLP二元核心词典详细解析
查看>>
Paxos——分布式一致性算法解析
查看>>
终于拿到证了....
查看>>
Java程序员: 选择比努力更重要
查看>>
PDF编辑技巧:怎么提取PDF文件中的页面
查看>>
使用bash shell 查看Linux系统的CPU和内存
查看>>
fuse文件系统
查看>>
全球首个大网级网络操作系统CNOS正式发布
查看>>
C经典实例
查看>>
Oracle图形化的数据库管理工具
查看>>
Oracle用户、权限、角色管理
查看>>
在WINDOWS平台测试一下文件读取
查看>>
前端必须要了解的面试题
查看>>
AngularJS Form 进阶:远程校验和自定义输入项
查看>>
shell编程注意
查看>>
vSphere Client开启虚拟机提示:出现了常规系统错误: 由于目标计算机积极拒绝,无法连接。...
查看>>