重温Spring之旅3——装配Bean(手工装配:使用注解方式)

来源:互联网 发布:mysql严格模式 编辑:程序博客网 时间:2024/06/05 19:50

Autowired注解

手工装配--->使用注解方式--->Autowired注解

注意:
*如果使用jdk1.5,需要引入
com.springsource.javax.annotation-1.0.0.jar包
*如果使用jdk1.6,不需要引入
com.springsource.javax.annotation-1.0.0.jar包

com.springsource.javax.annotation-1.0.0.jar 
该jar包在spring-framework-3.0.2.RELEASE-dependencies\javax.annotation\com.springsource.javax.annotation\1.0.0包下

Autowired标注在字段上  

* @Autowired注解默认按类型进行装配
* 获取该注解标注的字段的类型---PersonDao类型
*  以该类型为条件到spring容器(beans.xml)中去查找bean的id节点的类型是PersonDao类型.
*  找到以后,获取该节点对应的对象,利用反射直接为personDao变量赋值 
  
* @Qualifier(“personDao”)该注解以名字为条件查找依赖对象
*  以该注解的的参数personDao条件到spring容器(beans.xml)中去查找bean的id节点的
   值是personDao的对象
*  找到以后,获取该节点对应的对象, 利用反射直接为personDao变量赋值 
   如果不存在该名称,抛出异常
@Autowired 
private PersonDao  personDao;//用于字段上

@Autowired   @Qualifier("personDao")
private PersonDao  personDao;//用于字段上

Autowired标注在setter方法上 

     @Autowired注解默认按类型进行装配
           *  获取 setPersonDao()方法的参数的类型---PersonDao类型
           *  以该类型为条件到spring容器(beans.xml)中去查找bean的id节点的类型是PersonDao类型.
  * 找到以后,获取该节点对应的对象, 把该对象作为实参传递给该setPersonDao(PersonDao personDao)的形参.
     @Qualifier("personDao")该注解以名字为条件查找依赖对象
*  以该注解的的参数personDao条件到spring容器(beans.xml)中去查找bean的id节点的
  值是PersonDao的对象
*  找到以后,获取该节点对应的对象, 把该对象作为实参传递给该setPersonDao(
      PersonDao personDao)的形参.
* 如果不存在该名称,抛出异常
 
@Autowired
public void setPersonDao(PersonDao personDao) {  //用于属性的set方法上
    this.personDao = personDao;
}
@Autowired @Qualifier("personDao")
public void setPersonDao(PersonDao personDao) {  //用于属性的set方法上
    this.personDao = personDao;

}

例子:

IUserDao.java

package com.csii.dao;public interface IUserDao {public void save();}
UserDaoImpl.java

package com.csii.dao;public class UserDaoImpl implements IUserDao {public UserDaoImpl() {super();System.out.println("这是UserDaoImpl的构造方法");}@Overridepublic void save() {System.out.println("这是UserDaoImpl的save()方法");}}
IUserService.java

package com.csii.service;public interface IUserService {public void save();}
UserServiceImpl.java

package com.csii.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import com.csii.dao.IUserDao;public class UserServiceImpl implements IUserService {/** * 完成对对象注入的操作(注解) * Autowired标注在字段上(默认按照属性的类型进行匹配) * @Autowired:如果放置到字段上,就会用当前属性的类型IUserDao到Spring容器中查找<bean class>对应的数据类型 * *如果找到了,就返回对应的数据类型,并通过反射机制将对象UserDaoImpl赋值给当前的属性userDao * *如果没有找到,就会抛出异常。 * @Qualifier("userDao"):添加此注解此时不是在用类型进行匹配,而是用@Qualifier定义的属性名称到spring容器 * 中找<bean id>对应的id的属性值 * * 如果2个值相等,就返回对应的对象,并通过反射机制将对象UserDaoImpl赋值给当前的属性userDao * * 如果2个值不相等,就抛出异常 *  */@Autowired @Qualifier("userDao1")private IUserDao userDao;public IUserDao getUserDao() {return userDao;}/** * 完成对对象注入的操作(注解) * Autowired标注在setter方法上 *     @Autowired:如果放置到set方法上,就会用set方法中传递的参数类型IUserDao到spring容器的中查找<bean class>对应的数据类型 *        * 如果找到了,就返回对应的数据类型,并将返回的对象UserDaoImpl通过形参传递给实参,将实参赋值给userDao *        * 如果没有找到,就会抛出异常 *     @Qualifier("userDao"):添加此注解此时不是在用类型进行匹配,而是用@Qualifier定义的属性名称到spring容器中找<bean id>对应的id的属性值 *        * 如果2个值相等,就返回对应的对象,并将返回的对象UserDaoImpl通过形参传递给实参,将实参赋值给userDao *        * 如果2个值不相等,就抛出异常 */@Autowired @Qualifier("userDao1")public void setUserDao(IUserDao userDao) {this.userDao = userDao;}public UserServiceImpl() {super();System.out.println("这是UserServiceImpl类的构造方法");}@Overridepublic void save() {userDao.save();System.out.println("这是UserServiceImpl类的save()方法");}}
beans.xml

<?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-3.0.xsd           http://www.springframework.org/schema/context           http://www.springframework.org/schema/context/spring-context-3.0.xsd"><!--  添加基于注解的命名空间:添加:xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="           http://www.springframework.org/schema/context           http://www.springframework.org/schema/context/spring-context-3.0.xsd"--><!--  <context:annotation-config/>这个配置隐式注册了多个对注解进行解析处理的处理器--><context:annotation-config/><bean id="userDao1" class="com.csii.dao.UserDaoImpl" /><bean id="userService" class="com.csii.service.UserServiceImpl"><!-- <property name="userDao" ref="userDao"></property> --></bean></beans>
App.java

package com.csii.app;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.csii.service.IUserService;public class App {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");IUserService bean = (IUserService) ctx.getBean("userService");bean.save();}}

@Resource

手工装配--->使用注解方式--->resource注解

Resource注解标注在字段上

*@Resource注解默认按名称装配。
*如果没有指定name属性,获取该注解标注的字段值---personDao,以该字段值为条件到spring容器(beans.xml)中去查找bean的id节点的值是 personDao的节点
*找到以后,获取该节点对应的对象, 利用反射直接为personDao变量赋值
*如果没有找到.并且按照默认的名称找不到依赖对象时, @Resource注解会回退到按类型装配,获取该注解标注的字段类型--PersonDao
  以该类型为条件到spring容器(beans.xml)中去查找bean的节点的类型是PersonDao类型的对象
      找到以后,获取该节点对应的对象,利用反射直接为personDao变量赋值
*如果指定name属性,只能按名称装配
*获取name属性的值 personDao,以该值为条件到spring容器(beans.xml)中去查找bean的id节点的值是PersonDao的对象
       *找到以后,获取该节点对应的对象,利用反射直接为personDao变量赋值
       *如果不存在该名称,抛出异常
@Resource(name="personDao")
private PersonDao personDao;;//用于字段上

resource注解标注在setter方法上 

     *@Resource注解默认按名称装配。
     *如果没有指定name属性,获取setPersonDao()方法的属性名---personDao,
以该属性名为条件到spring容器(beans.xml)中去查找bean的id节点的值是personDao的节点
     *找到以后,获取该节点对应的对象, 把该对象作为实参传递给该setPersonDao(PersonDao personDao)的形参.
     *如果没有找到.并且按照默认的名称找不到依赖对象时,@Resource注解会回退到按类型装配,获取setPersonDao()方法的参数类型---PersonDao
      以该类型为条件到spring容器(beans.xml)中去查找bean的节点的类型是PersonDao类型对象
      找到以后,获取该节点对应的对象, 把该对象作为实参传递给该setPersonDao(PersonDao personDao)方法的形参 
     * 如果指定name属性  只能按名称装配
*获取name属性的值,以该值为条件到spring容器(beans.xml)中去查找bean的id节点的值是PersonDao的对象
*找到以后,获取该节点对应的对象, 把该对象作为实参传递给该setPersonDao(PersonDao personDao)的形参.
*如果不存在该名称,抛出异常
@Resource(name="personDao")
public void setPersonDao(PersonDao personDao){
       this.personDao = personDao;
}


例子:

IUserDao.java

package com.csii.dao;public interface IUserDao {public void save();}

UserDaoImpl.java

package com.csii.dao;public class UserDaoImpl implements IUserDao {public UserDaoImpl() {super();System.out.println("这是UserDaoImpl的构造方法");}@Overridepublic void save() {System.out.println("这是UserDaoImpl的save()方法");}}

IUserService.java

package com.csii.service;public interface IUserService {public void save();}

UserServiceImpl.java

package com.csii.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import com.csii.dao.IUserDao;public class UserServiceImpl implements IUserService {/** * 完成对对象注入的操作(注解) * Autowired标注在字段上(默认按照属性的类型进行匹配) * @Autowired:如果放置到字段上,就会用当前属性的类型IUserDao到Spring容器中查找<bean class>对应的数据类型 * *如果找到了,就返回对应的数据类型,并通过反射机制将对象UserDaoImpl赋值给当前的属性userDao * *如果没有找到,就会抛出异常。 * @Qualifier("userDao"):添加此注解此时不是在用类型进行匹配,而是用@Qualifier定义的属性名称到spring容器 * 中找<bean id>对应的id的属性值 * * 如果2个值相等,就返回对应的对象,并通过反射机制将对象UserDaoImpl赋值给当前的属性userDao * * 如果2个值不相等,就抛出异常 *  */@Autowired @Qualifier("userDao1")private IUserDao userDao;public IUserDao getUserDao() {return userDao;}/** * 完成对对象注入的操作(注解) * Autowired标注在setter方法上 *     @Autowired:如果放置到set方法上,就会用set方法中传递的参数类型IUserDao到spring容器的中查找<bean class>对应的数据类型 *        * 如果找到了,就返回对应的数据类型,并将返回的对象UserDaoImpl通过形参传递给实参,将实参赋值给userDao *        * 如果没有找到,就会抛出异常 *     @Qualifier("userDao"):添加此注解此时不是在用类型进行匹配,而是用@Qualifier定义的属性名称到spring容器中找<bean id>对应的id的属性值 *        * 如果2个值相等,就返回对应的对象,并将返回的对象UserDaoImpl通过形参传递给实参,将实参赋值给userDao *        * 如果2个值不相等,就抛出异常 */@Autowired @Qualifier("userDao1")public void setUserDao(IUserDao userDao) {this.userDao = userDao;}public UserServiceImpl() {super();System.out.println("这是UserServiceImpl类的构造方法");}@Overridepublic void save() {userDao.save();System.out.println("这是UserServiceImpl类的save()方法");}}
beans.xml

<?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-3.0.xsd           http://www.springframework.org/schema/context           http://www.springframework.org/schema/context/spring-context-3.0.xsd"><!--  添加基于注解的命名空间:添加:xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="           http://www.springframework.org/schema/context           http://www.springframework.org/schema/context/spring-context-3.0.xsd"--><!--  <context:annotation-config/>这个配置隐式注册了多个对注解进行解析处理的处理器--><context:annotation-config/><bean id="userDao1" class="com.csii.dao.UserDaoImpl" /><bean id="userService" class="com.csii.service.UserServiceImpl"><!-- <property name="userDao" ref="userDao"></property> --></bean></beans>
App.java

package com.csii.app;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.csii.service.IUserService;public class App {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");IUserService bean = (IUserService) ctx.getBean("userService");bean.save();}}

指定Bean的初始化方法和销毁方法(注解)

Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法。


UserServiceImpl.java

package com.csii.service;import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;import javax.annotation.Resource;import com.csii.dao.IUserDao;public class UserServiceImpl implements IUserService {/** * 完成对对象注入的操作(注解) * @Resource 注解标注在字段上 * 先按照属性名称userDao到spring容器中查找<bean id="userDao">对应的类, * *如果找到了,就直接使用id节点对应的class类,通过java的反射机制将class类型给IUserDao userDao的属性 * *如果没有找到,就按照类型IUserDao到spring容器中进行匹配,匹配bean节点对应的class * *如果找到了,就返回该bean节点对应的类型,通过java的反射机制将class类型给IUserDao userDao的属性 * *如果没有找到,则抛出异常 *  @Resource(name="userDao"):此时表示只能按照名称进行匹配。 *///@Resourceprivate IUserDao userDao;public IUserDao getUserDao() {return userDao;}/** * * 完成对对象注入的操作(注解) *  *   @Resource注解标注在字段上 *     先按照参数名称userDao到spring容器中查找<bean id="userDao">的对应类, *        * 如果找到了,就直接使用id节点对应的class类,通过参数将形参转换为实参将class类型给set方法的参数IUserDao userDao的属性 *        * 如果没有找到,就按照参数类型IUserDao到spring容器中进行匹配,匹配bean节点对应的class *                * 如果找到了,就返回该bean节点对应的类型,通过参数将形参转换为实参将class类型给set方法的参数IUserDao userDao的属性 *                * 如果没有找到,则抛出异常 *   @Resource(name = "userDao"):此时表示只能按照名称进行匹配 */@Resource(name="userDao")public void setUserDao(IUserDao userDao) {this.userDao = userDao;}public UserServiceImpl() {super();System.out.println("这是UserServiceImpl类的构造方法");}@Overridepublic void save() {userDao.save();System.out.println("这是UserServiceImpl类的save()方法");}//初始化@PostConstructpublic void init(){System.out.println("这是init方法");}//销毁@PreDestroypublic void destory(){System.out.println("这是destory方法");}}


0 0
原创粉丝点击