好久没有碰java了,今晚有空看了看spring2.5的anntation注入 确实方便好用,今日好好学习一下
导入所需jar包
spring.jar
asm-2.2.2.jar (*)
asm-commons-2.2.2.jar (*)
asm-util-2.2.2.jar (*)
cglib-nodep-2.1_3.jar (*)
commons-logging.jar
此处顺便说说其他那两个框架的基本包
struts2必须JAR包(6个):
struts2-spring-plugin-2.0.11.2.jar
xwork-2.0.5.jar
struts2-core-2.0.11.2.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
commons-logging-1.0.4.jar(与hibernate3.2必须JAR包重复,取一个既可)
hibernate3.2必须JAR包(8个):
antlr-2.7.6.jar
commons-collections-2.1.1.jar
commons-logging-1.0.4.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
hibernate3.jar
jta.jar
log4j-1.2.11.jar
此处我们只用spring2.5 的包
项目结构(以下都是模仿形式我实际操作)
org.dao.interfaces.IUser
org.dao.UserImpl
org.service.UserService
org.test.TestClass
package org.dao.interfaces;
/**
*@author:张奇峰
*2009-6-10 下午08:35:19
*/
public interface IUser {
public void save(String userName);
public void delete(int id);
}
package org.dao;
import org.dao.interfaces.IUser;
/**
*@author:张奇峰
*2009-6-10 下午08:38:12
*/
public class UserImpl implements IUser {
public void delete(int id) {
// TODO Auto-generated method stub
}
public void save(String userName) {
System.out.println("用户"+userName+"保存成功!");
}
}
package org.service;
import javax.annotation.Resource;
import org.dao.interfaces.IUser;
/**
*@author:张奇峰
*2009-6-10 下午08:37:04
*/
public class UserService {
//这就是注释
@Resource
public IUser userOperate=null;
public void setUserOperate(IUser userOperate) {
this.userOperate = userOperate;
}
public void save(String userName)
{
userOperate.save(userName);
}
}
bean.xml
<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-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
">
<!-- 这一句很重要!告诉spring容器进行注解注入-->
<context:annotation-config/>
<bean id="userimpl" class="org.dao.UserImpl"></bean>
<bean id="userService" class="org.service.UserService"></bean>
</beans>
package org.test;
import org.junit.*;
import org.service.UserService;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
*@author:张奇峰
*2009-6-10 下午08:38:26
*单元测试
*/
public class TestClass {
@Test
public void test() throws Exception {
AbstractApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
UserService service=(UserService)context.getBean("userService");
service.save("zhanqsan");
context.close();
}
}
执行输出:用户zhanqsan保存成功!
类似于@Resource的还有@Autowired,两个注解的区别是:
@Autowired默认按类型装配,@Resource默认按名称装配,当找不到名称匹配的bean才会按类型装配。
@Autowired也可以按名称进行装配
例如如上 @Autowired @Qualifier("userService") 效果是一样的!
在classpath 自动扫描方式把组件纳入spring容器中管理
这个也是比较OK的 个人比较喜欢的!可以一定程度上摆脱配置文件
spring2.5引入了组件自动扫描机制,可以在类路径底下寻找标注了@Component @Service @Controller @Repository
注解的类,并将这些类纳入进spring容器中管理。它们的作用和xml文件中使用bean 节点配饰组件是一样的。
(1)使用到了注解的功能(需要注解准备工作的内容)
(2)在xml中加入
<context:component-scan base-package="org" /><!--org下的包及其子包-->
其中base-package 为需要扫描的包(包含子包)
(3)
@Service用于标注业务逻辑层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件 ,即DAO 组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注,比如说切面类,其它。。。
测试:
package org.dao;
import org.dao.interfaces.IUser;
import org.springframework.stereotype.Repository;
/**
*@author:张奇峰
*2009-6-10 下午09:56:15
*/
//标注为DAO组件
@Repository
public class UserImpl2 implements IUser {
public void delete(int id) {
// TODO Auto-generated method stub
}
public void save(String userName) {
System.out.println("保存"+userName+"成功!haha!");
}
}
package org.service;
import javax.annotation.Resource;
import org.dao.interfaces.IUser;
/**
*@author:张奇峰
*2009-6-10 下午08:37:04
*/
public class UserService {
//注入的名称默认是类的名称且首字母小写
@Resource(name="userImpl2")
public IUser userOperate=null;
public void setUserOperate(IUser userOperate) {
this.userOperate = userOperate;
}
public void save(String userName)
{
userOperate.save(userName);
}
}
在beam.xml 中添加
<context:component-scan base-package="org"/>
另外无需改动 输出结果为:保存zhanqsan成功!haha! 正是所预料的一般