【Spring3】(2)常用注入
2016-01-11 21:39
483 查看
我们修改一下配置文件,现在将原来的配置文件分开为两个,applicationContext.xml:
其中bean的意思表示是全局中找userManager这个引用,如果使用local就表示在当前文件中寻找这个引用。
applicationContext2.xml:
其中ref表示引用当前的变量。
获取这些属性注入的值:
此时就可以使用构造注入来实现:
构造注入这里有一个需要注意的问题,就是提防循环注入:
如果相对配置中所有的bean都是用同一个自动注入方式,可以在最开始beans标签中的配置中设定:
我们可以选择在方法处注解:
再简单点,我们甚至可以不用在配置文件中配置bean来达到效果,但是需要加入这一句话:
同样也可以给UserAction配置多例的注解:
我们重新创建包放置java文件:
数据访问层这样子配置:
在服务层我们这样子配置:
Action中这样子配置:
<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.class也是同样可以的。
// UserAction ua = (UserAction) factory.getBean(UserAction.class);
UserAction ua = (UserAction) factory.getBean("uAction");
ua.execute();
同样也可以给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,其实它们完成的工作都是一样的,都是完成组件实例化。
相关文章推荐
- JAVA中的String常量池
- eclipse在Ubuntu 13.04下的安装过程及问题小记
- 求子串在整串中出现的次数(JAVA编写)
- 21个值得收藏的javas技巧
- Java 使用线程经验之阻塞队列
- 深入理解java核心卷轴---编码utf-8
- Resolution in《The Java® Virtual Machine Specification Java SE 7 Edition》
- JAVA中的equals方法与“==”
- Eclipse快捷键 10个最有用的快捷键
- Java Swing JTable 表格【7:监听表格数据变化】
- eclipse使用Hibernate tools反向工程插件遇到的几个问题
- JAVA中的String类--String的最大长度
- Spring 4 MVC 单元测试例子
- Spring MVC + Mybatis + Shiro
- Java异常机制
- spring+mybaits多数据源使用
- spring+mybaits多数据源使用
- spring+mybaits多数据源使用
- java web用户频繁非正常登出系统(session丢失)的原因分析及解决思路
- 【JDK源码分析】String的存储区与不可变性(转)