您的位置:首页 > 编程语言 > Java开发

【Spring3】(2)常用注入

2016-01-11 21:39 483 查看
我们修改一下配置文件,现在将原来的配置文件分开为两个,applicationContext.xml:

<bean id="userAction" class="com.thr.spring.UserAction" scope="singleton">
<property name="manager">
<ref bean="userManager" />
</property>
</bean>

其中bean的意思表示是全局中找userManager这个引用,如果使用local就表示在当前文件中寻找这个引用。
applicationContext2.xml:
<bean id="userManager" class="com.thr.spring.UserManager" scope="prototype">
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>123456</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:8080</value>
</property>
<property name="driverClass">
<value>jdbc.mysql.Driver</value>
</property>
</bean>
那么此时还用原来的
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
就会报异常了,此时就需要使用:
BeanFactory factory = new ClassPathXmlApplicationContext("app*.xml");

一. 属性注入

我们给UserAction添加如下成员变量:
private List list = null;
private Set set = null;
private Map map = null;
private Properties props = null;
复写get和set方法,此时要想获取这几个属性注入的值,就需要这样子配置文件:
<bean id="userAction" class="com.thr.spring.UserAction" scope="singleton">
<property name="manager">
<ref bean="userManager" />
</property>
<property name="list">
<list>
<value>222</value>
<value>111</value>
<ref local="cur" />
</list>
</property>
<property name="set">
<set>
<value>hell</value>
<value>hello</value>
<value>true</value>
<value>2.2</value>
<value type="java.lang.String">false</value>
</set>
</property>
<property name="map">
<map>
<entry key="k">
<value>234</value>
</entry>
<entry key="k2">
<value>true</value>
</entry>
</map>
</property>
<property name="props">
<props>
<prop key="k">asfsd</prop>
<prop key="k1">false</prop>
</props>
</property>
</bean>
<bean id="cur" class="java.util.Date" />

其中ref表示引用当前的变量。
获取这些属性注入的值:
BeanFactory factory = new ClassPathXmlApplicationContext("app*.xml");
UserAction ua = (UserAction) factory.getBean("userAction");
for (Object o : ua.getList()) {
System.out.println(o);
}
System.out.println("************************************");
for (Object o : ua.getSet()) {
System.out.println(o);
}
System.out.println("************************************");
for (Iterator it = ua.getMap().entrySet().iterator(); it.hasNext();) {
Entry entry = (Entry) it.next();
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
System.out.println("************************************");
for (Iterator it = ua.getProps().entrySet().iterator(); it.hasNext();) {
Entry entry = (Entry) it.next();
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}

二. 构造注入

我们有这样一个A类:
private int id;
private String username;
private String password;
private char sex;
private Date birthday;
private B b;
复写get和set方法,还有一个带全部成员变量的构造方法。

此时就可以使用构造注入来实现:
<bean id="a" class="com.thr.spring.A">
<constructor-arg index="0" value="10" />
<constructor-arg index="1" value="Jerry" />
<constructor-arg value="123" />
<constructor-arg value="F" />
<constructor-arg ref="cur" />
</bean>
index的属性可以指定也可以不指定,但顺序必须和类构造方法中参数的顺序是一致的。
构造注入这里有一个需要注意的问题,就是提防循环注入:
<bean id="a" class="com.thr.spring.A">
<constructor-arg ref="b"></constructor-arg>
</bean>
<bean id="b" class="com.thr.spring.B">
<constructor-arg ref="a"></constructor-arg>
</bean>
这种情况在创建工厂的时候就会报错了。这时候可以使用属性注入来实现:
<bean id="a" class="com.thr.spring.A">
<property name="b" ref="b" />
</bean>
<bean id="b" class="com.thr.spring.B">
<property name="a" ref="a" />
</bean>
注意,此时必须有默认构造器,不然A和B都无法创建出来了。

三. 自动注入

在bean的配置中有这样子的一个属性autowire,这里介绍几个:

1. byType

这个表示按照类型来自动注入,就是找set方法中和参数类型一直的进行自动注入。但当有两个一样类型的bean存在的时候就会报错。 

2. byName

这个表示按照set方法中参数名一致的进行自动注入。

3. constructor

这个表示按照构造方法中类型一致的进行自动注入。但是如果有两个类型一致的bean也会报异常,但是如果修改其中一个bean的id为符合byName中参数的bean,就可以顺利通过。
如果相对配置中所有的bean都是用同一个自动注入方式,可以在最开始beans标签中的配置中设定:
default-autowire="byName"
或者是其它的方式。

四. 注解注入

首先要修改我们的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 启用注解注入 -->
<context:annotation-config />
<bean id="userAction" class="com.thr.spring.UserAction" scope="singleton" />
</beans>
此刻,只需要简单的注解就可以完成注入了。
我们可以选择在方法处注解:
@Resource
public void setManager(UserManager manager) {
System.out.println("调用了set方法");
this.manager = manager;
}
也可以在成员变量出注解:
@Resource
private UserManager manager = null;
这样子,甚至不用写set方法了。
再简单点,我们甚至可以不用在配置文件中配置bean来达到效果,但是需要加入这一句话:
<!-- 启用组件扫描 -->
<context:component-scan base-package="com.thr" />
这样子需要给UserAction加入注解:
@Component("uAction")
public class UserAction {

<span>	</span>@Resource(name = "uManager")
<span>	</span>private UserManager manager = null;
也需要对UserManager做相应的注解:
@Component("uManager")
public class UserManager {
主类就可以这样子调用了:
BeanFactory factory = new ClassPathXmlApplicationContext("app*.xml");
// UserAction ua = (UserAction) factory.getBean(UserAction.class);
UserAction ua = (UserAction) factory.getBean("uAction");
ua.execute();
使用UserAction.class也是同样可以的。

同样也可以给UserAction配置多例的注解:
<span style="font-family: 'Microsoft YaHei';"></span><pre name="code" class="java">@<span style="font-family: 'Microsoft YaHei';">Component("uAction")</span>
@Scope("prototype")
public class UserAction {


我们重新创建包放置java文件:



数据访问层这样子配置:
@Repository("manager")
public class UserManager {

在服务层我们这样子配置:

@Service("service")
public class UserService {

@Resource(name = "manager")
private UserManager userManager;

public void service() {
System.out.println("调用了Service");
userManager.add(new User());
}
}

Action中这样子配置:
@Controller("uAction")
public class UserAction {

@Resource(name = "service")
private UserService userService;

public UserAction() {
}

public String execute() {
System.out.println("Action执行");
userService.service();
return "success";
}
}
执行:
public static void main(String[] args) {
// 创建Spring Bean工程
BeanFactory factory = new ClassPathXmlApplicationContext("app*.xml");
UserAction ua = (UserAction) factory.getBean("uAction");
ua.execute();
}
这里看似用了不同的Repository、Service、Controller,其实它们完成的工作都是一样的,都是完成组件实例化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: