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注解模式的一个项目,之中也遇到过很多问题 ,为了防止以后遇到同样问题现记录一下知识点以及详细配置. 首先我 ...
随机推荐
- Networking - ARP 协议
ARP 协议概述 ARP(Address Resolution Protocol),即地址解析协议,用于把 IP 地址映射到物理地址.网段上的每台主机都维护着一个被称为 ARP Table 或 ARP ...
- Animated App Boot Example : Fastest animation at app boot time
This iPhone app shows how to create an animation that is displayed when the app starts. The animatio ...
- android stack error message is Fail to start the plugin
E: 08-26 16:34:11.934: E/AliSDK(32236): 错误编码 = 1002208-26 16:34:11.934: E/AliSDK(32236): 错误消息 = SDK ...
- python学习day4--python基础--字典
字典的常用操作: #字典天然去重,key唯一,如果key相同,只能打印出一个 id_db={ 220456789852963741:{ 'name':"alex", 'age':3 ...
- Android之文字点击链接
定义textView1和textView2并获得组件. String html = "<font color='red'></font>"; html += ...
- sqlserver2008 如何定时清理索引碎片
sqlserver2008 如何定时清理索引碎片 查询索引引起的表垃圾碎片sql脚本: SELECT object_name(a.object_id) [TableName] ,a.index_id ...
- asp.net 文件上传示例整理
ASP.NET依托.net framework类库,封装了大量的功能,使得上传文件非常简单,主要有以下三种基本方法. 方法一:用Web控件FileUpload,上传到网站根目录. 代码如下 复制代码 ...
- Swift调用Objective-C
Swift调用Objective-C需要一个名为“<工程名>-Bridging-Header.h”的桥接头文件,如下图所示.桥接头文件的作用是为Swift调用Objective-C对象搭建 ...
- PHP学习笔记 - 进阶篇(9)
PHP学习笔记 - 进阶篇(9) 图形图像操作 GD库简介 GD指的是Graphic Device,PHP的GD库是用来处理图形的扩展库,通过GD库提供的一系列API,可以对图像进行处理或者直接生成新 ...
- Cocoa 框架为什么采用两阶段的方式来创建对象?
对于之前一直使用C#语言的我来说,刚开始接触Objective-c来创建对象时很迷惑,为何创建对象一般情况下需要通过发送两个消息(调用两个方法)才能创建一个类实例对象(例如[[UIButton all ...