spring的配置模式与注解模式基础
“依赖注入”是spring的核心特征,在Web服务器(如Tomcat)加载时,它会根据Spring的配置文件中配置的bean或者是通过注解模式而扫描并装载的bean实例自动注入到ApplicationContext容器中(ApplicationContext容器管理了被注入的bean对象)。
下面做两个简单测试以说明spring“依赖注入“的两种模式:配置模式与注解模式。
测试工具:

一、新建spring配置文件,放在类目录下
在“src”上右键点"new",选择"Other”,搜索关键词"spring",选择Spring Bean Configuration File,点击"Next"

起个名字,点击“Finish”

建好的springTest.xml在类路径下,如下图所示:

二、.配置springTest.xml
首先,打开springTest.xml,如下所示--但这还不够,因为还需要一个xmlns:context="http://www.springframework.org/schema/context"作为配置环境,下面就开始配置吧。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
a.配置xmlns:context="http://www.springframework.org/schema/context",见下图:

b.配置bean
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 将一个员工实例注入spring的ApplicationContext容器中。 -->
<bean id="testEmpl" class="com.chen.vo.Empl">
<property name="ename" value="testName"></property>
<property name="birthday" value="1999-01-01"></property>
</bean> </beans>
现在,已经通过在springTest.xml中的配置将一个员工实例注入到ApplicationContext容器中了,下面将讲解怎样获取这个员工。
创建测试类SpringTest并编写getTestEmpl方法
@RunWith(SpringJUnit4ClassRunner.class)表示这是SpringJUnit4类型的测试类,而非单纯的JUnit4。
@ContextConfiguration("classpath:springTest.xml") 表示spring的配置文件路径。
FileSystemXmlApplicationContext是ApplicationContext 接口的一个实现类,它用来加载指定路径的spring配置文件。
classpath:springTest.xml表示类路径下的配置文件
package com.chen.test; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:springTest.xml")
public class springTest { //获取ApplicationContext容器中的实例
@Test
public void getTestEmpl(){
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath:springTest.xml");
//获取id为testEmpl的实例
System.out.println(applicationContext.getBean("testEmpl"));
}
}
打印信息如下:
Empl [eid=0, ename=testName, password=null, sex=null, birthday=1999-01-01, hiredate=null, admin=0, deptno=0, job=0, status=0, funs=null]
小结:通过以上的例子大致能了解到spring的“依赖注入”的这个核心特征,简单地说,我们通过在spring文件中的配置,把bean交给ApplicationContext 容器管理,通过其getBean方法获取指定bean对象。下面将在此基础上举例说明注解模式是怎么一回事。
一、配置spring.xml
说明:spring.xml的配置路径和springTest.xml一样,放在类路径下。
配置如下所示:(可以看出,在下面的配置中并没有配置任何bean实例,spring会在启动时扫描指定的包(com.chen指的是扫描所有以com.chen开头的包),
然后将相应bean注入到ApplicationContext容器中)
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 开启注解模式 -->
<context:annotation-config/>
<!-- 扫包(使用“注解模式”需要此配置)。服务器在启动时会扫描base-package所指定的包,并将相应的bean注入ApplicationContext容器。 -->
<context:component-scan base-package="com.chen"></context:component-scan> </beans>
二、使用关键字“@Repository”将EmplDaoImpl 类的一个实例注入ApplicationContext容器中
这里使用了一个标识关键字“@Repository”,通过注解模式将模型层的实例注入ApplicationContext容器中需使用这个标识(那要是向ApplicationContext容器中注入控制层实例呢?参见“附:注入关键字说明”)。可以简单地理解,因为有了这个标识,spring在加载时扫到com.chen.dao包中的EmplDaoImpl 类时,自动地new了一个EmplDaoImpl 类的实例,并将这个实例注入到ApplicationContext容器中,这个实例名为“emplDaoImpl”。
@Repository("emplDaoImpl")//向ApplicationContext容器中注入EmplDaoImpl的一个实例
public class EmplDaoImpl extends BaseDaoImp<Empl>{
/**
* 添加员工
* @param empl
* @return
*/
public boolean addEmp(Empl empl){
String sql = "insert into t_empl values(SEQ_EMPL.nextval,?,?,?,to_date(?,'yyyy-mm-dd'),to_date(?,'yyyy-mm-dd'),?,?,?,?)";
return update(sql, empl.getEname(),empl.getPassword(),empl.getSex(),
empl.getBirthday(),empl.getHiredate(),empl.getAdmin(),
empl.getDeptno(),empl.getJob(),empl.getStatus());
}
...
}
三、测试
新建一个测试类SpringTest2 。这个类中涉及到2个关键字:@Autowired、@Resource,它们都能将注入到ApplicationContext容器中的实例自动装载到当前类中--与第一个测试类SpringTest(手动装载)比较一下就会很容易发现它们的好处。
package com.chen.test; import javax.annotation.Resource; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.chen.dao.EmplDaoImpl;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring.xml")
public class SpringTest2 {
//自动装载1
//@Autowired
//EmplDaoImpl emplDaoImpl; //自动装载2
@Resource
EmplDaoImpl emplDaoImpl;
@Test
public void getEmplDaoImpl(){
System.out.println(emplDaoImpl);
} }
打印信息:
com.chen.dao.EmplDaoImpl@13ff9d4
打印的hash码值说明该实例已获取到,我们可以调用emplDaoImpl的方法看下是否真的如此:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring.xml")
public class SpringTest2 {
//自动装载1
//@Autowired
//EmplDaoImpl emplDaoImpl; //自动装载2
@Resource
EmplDaoImpl emplDaoImpl;
@Test
public void getEmplDaoImpl(){
System.out.println(emplDaoImpl);
}
@Test
public void getEmplById(){
System.out.println(emplDaoImpl.findEmplById(6));
} }
打印信息:
Empl [eid=6, ename=oo, password=123, sex=女, birthday=1999-01-01 00:00:00.0, hiredate=1999-01-01 00:00:00.0, admin=1, deptno=1, job=1, status=0, funs=null]
小结:通过以上两个实例可以大致了解到Spring的工作机制已经其核心特性--依赖注入,今后,我们便可以通过Spring配置来管理项目中的需要管理的bean对象了。
详情参见:
http://jinnianshilongnian.iteye.com/blog/1457223
http://jinnianshilongnian.iteye.com/blog/1457224
http://jinnianshilongnian.iteye.com/blog/1461055
附:注入关键字说明
@Repository、@Service、@Controller 和 @Component 将类标识为Bean
@Repository注解便属于最先引入的一批,它用于将数据访 问层 (DAO 层 ) 的类标识为 Spring Bean。具体只需将该注解标注在 DAO类上即可。同时,为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用Bean 的自动扫描功能,这可以通过<context:component-scan/>实现。
为什么 @Repository 只能标注在 DAO 类上呢?这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。
Spring 2.5 在 @Repository的基础上增加了功能类似的额外三个注解:@Component、@Service、@Constroller,它们分别用于软件系统的不同层次:
- @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
- @Service 通常作用在业务层,但是目前该功能与 @Component 相同。
- @Constroller 通常作用在控制层,但是目前该功能与 @Component 相同。
详见:http://www.cnblogs.com/wql025/p/4806985.html
spring的配置模式与注解模式基础的更多相关文章
- [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring AOP配置简单记录(注解及xml配置方式)
在了解spring aop中的关键字(如:连接点(JoinPoint).切入点(PointCut).切面(Aspact).织入(Weaving).通知(Advice).目标(Target)等)后进行了 ...
- Spring 之 配置(Java之负基础实战)
1.程序加入Spring <?xml version="1.0" encoding="utf-8"?> <web-app xmlns=&quo ...
- spring 注解模式 详解
Spring基于注解实现Bean定义支持如下三种注解: Spring自带的@Component注解及扩展@Repository.@Service.@Controller,如图12-1所示: JSR-2 ...
- Network基础(四):MAC地址表及邻居信息查看、配置接口速率及双工模式、配置交换机管理IP
一.MAC地址表及邻居信息查看 目标: 本例要求为修改计算机名并加入工作组: 查看交换机MAC地址表 查看CISCO设备邻居信息 方案: 网络拓扑,如下图所示. 步骤: 步骤一:查看交换机sw1的ma ...
- spring,mybatis事务管理配置与@Transactional注解使用[转]
spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...
- Spring Cloud Netflix项目进入维护模式
任何项目都有其生命周期,Spring Could Netflix也不例外,官宣已进入维护模式,如果在新项目开始考虑技术选型时要考虑到这点风险,并考虑绕道的可能性. 原创: itmuch IT牧场 这 ...
- spring,mybatis事务管理配置与@Transactional注解使用
spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是 ...
- springMVC+springJDBC+Msql注解模式
最近基于Spring4.X以上的版本写了一个springMVC+springJDBC+Msql注解模式的一个项目,之中也遇到过很多问题 ,为了防止以后遇到同样问题现记录一下知识点以及详细配置. 首先我 ...
随机推荐
- Jersey(1.19.1) - Conditional GETs and Returning 304 (Not Modified) Responses
Conditional GETs are a great way to reduce bandwidth, and potentially server-side performance, depen ...
- memcached缓存机制+微软缓存机制使用详解
1. why Memcached 1.1 一台web服务器上,iis接收的请求数是有限的,当访问量超大的时候,网站访问就会遇到瓶颈了,处理方式就是运用多了服务器把请求数分流(集群),对外公布的就一 ...
- hiho拓扑排序专题 ——第四十八、四十七周
拓扑排序·一 分析: 此题就是求一个有向图中是否存在环. 如存在环则输出"Wrong", 若不存在环, 说明课程安排的合理,输出"Correct". 题中的提示 ...
- jquery之音乐均衡器
制作这个音乐均衡器需要一个equalizer插件(插件我已经上传),下面介绍一下网页的BGM的相关属性: hidden="true"表示隐藏播放,即不显示播放器的外观,若要想显示, ...
- JSP之Cookie
Cookie是小段的文本信息,在网络服务器上生成,并发送给浏览器,通过使用cookie可以标识用户身份,记录用户名和密码,跟踪重复等. 首先创建index.jsp: <%@page import ...
- iOS 9 之后更改状态栏字体颜色
设置statusBar的[前景部分] 简单来说,就是设置显示电池电量.时间.网络部分标示的颜色, 这里只能设置两种颜色: 默认的黑色(UIStatusBarStyleDefault) 白色(UISta ...
- 字符串转与ASCII码之间的互换
1.字符串转换成ASCII码 public static String stringToAscii(String value) { StringBuffer sbu = new StringBuffe ...
- (UVA 11624)Fire!
题目链接 http://vjudge.net/contest/121377#problem/J Joe works in a maze. Unfortunately, portions of the ...
- 终于解决了我的DISCUZ 无法连接到您的服务器,可能您的服务器处于防火墙后端 论坛云平台的问题~
事由:由于前几天折腾备份,将论坛源文件误删了大部分,于是我重新下载了源码,传到了空间. 然后问题来了,我关闭纵横搜索提示“无法连接到您的服务器,可能您的服务器处于防火墙后端”,设置纵横搜索页一直显示“ ...
- Nodejs微信接口
代码重要部分都已详细注释,test.js为实例,如果启动url请求,那么程序默认对json格式数据友好,如果有特殊需要,请自行修改返回数据的处理格式 大概功能简介为下: this._token 提供t ...