`
garrincha
  • 浏览: 12799 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

4Spring自动装配——annotation resource方式

阅读更多
对于自动装配的认识,经历了几个步骤
1手工配置xml
2在xml中配置bean,bean之间的注入关系用autowire
3不在xml中写autowire,写在annotation中
4干脆xml中一个bean也不写,bean和注入关系都挪到annotation中指定。
书接上回

使用注释进行autowire
上一讲用的注释的autowire,xml里面配置bean。
还是有一些麻烦,如果能不用配置bean,让spring自动扫描工程中(确切的说是给定包的位置)的类,然后把类自动实例化成bean,然后再根据类型或者名字的规则装配起来就更好了。
也就是说我们要达到这个效果,在上一讲的基础上,把xml中关于bean的配置也删除掉,并实现相同的效果。

0、先解释一下这次要用到的几个新注释
@Resource   放在set方法之上,表明这个地方需要注入对象(必须用component标注的类的对象).
@Component 放在类的声明上面,表明这是一个需要实例的对象,并给出对象的名字。用法见例子
1、首先修改UserService类
package com.spring.service;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import com.spring.dao.UserDao;

@Component("userService") 
//这里的userService的名字会在
//UserService service = (UserService) ctx.getBean("userService");
//中用到
public class UserService {

	private UserDao dao;
	public UserDao getDao() {
		return dao;
	}
	@Resource
	//表示这里需要注入对象
	public void setDao(UserDao dao) {
		this.dao = dao;
	}
	public void add()
	{
		dao.add();
	}
}



解释一下:类定义的上面用@Component注释表明这个类是需要实例化对象的,类似于在xml中定义了一个userService的bean。
@Resource表明这个地方需要注入对象,类似于在xml中用ref来表示注入的对象。
注意:同xml模式一样,被注入的对象必须实例化,也就是说被注入的UserDao这个类也需要加上@Component标签
2、修改UserDao类如下
package com.spring.dao;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

@Component("dao")//UserDao实例化的对象名dao,用于之后的注入
public class UserDao {

	public void add()
	{
		System.out.println("执行UserDao.add()方法");
	}
}

3、这两个地方修改之后,相当于autowire模式下在xml中写了2个bean。之后的装配工作由spring完成。开始测试吧
4、测试。测试代码不变
package com.spring.service.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.service.UserService;
public class UserServiceTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		ApplicationContext ctx =new ClassPathXmlApplicationContext("springbeans.xml");
		UserService service = (UserService) ctx.getBean("userService");
		service.add();
	}

}


测试结果如下
2014-8-27 17:34:10 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@30e3c624: display name [org.springframework.context.support.ClassPathXmlApplicationContext@30e3c624]; startup date [Wed Aug 27 17:34:10 HKT 2014]; root of context hierarchy
2014-8-27 17:34:10 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [springbeans.xml]
2014-8-27 17:34:10 org.springframework.context.support.ClassPathXmlApplicationContext obtainFreshBeanFactory
信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@30e3c624]: org.springframework.beans.factory.support.DefaultListableBeanFactory@2cc22a3b
2014-8-27 17:34:10 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@2cc22a3b: defining beans [dao,userService,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor]; root of factory hierarchy
执行UserDao.add()方法


[color="red"]一点其他[/red]
这里的注释@component可以改写为@Repository、@Service 和 @Controller,在具体使用中无差别,主要是为了从名字中识别这个被装配的组件在系统中的作用,仅此而已。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics