spring2.5注入学习

好久没有碰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!     正是所预料的一般


 

原文地址:https://www.cnblogs.com/zhangqifeng/p/1500888.html