注解装配Bean

时间:2021-04-30 09:34:44

@Service用于标注业务层组件
@Controller用于标注控制层组件
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

在一个稍大的项目中,如果组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。
Spring2.5为我们引入了组件自动扫描机制,他在类路径下寻找标注了上述注解的类,并把这些类纳入进spring容器中管理。
它的作用和在xml文件中使用bean节点配置组件时一样的。要使用自动扫描机制,才能把这些注解类纳入Spring容器中管理。

========================================================================

@Autowired 默认是通过byType方式进行自动装配的,通过结合@Qualifier注解可以通过匹配Bean的id进行自动装配。
a、@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;
b、@Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;
c、@Resource注解是由J2EE提供,而@Autowired是由Spring提供,故减少系统对spring的依赖建议使用@Resource的方式;
d、@Resource和@Autowired都可以书写标注在字段或者该字段的setter方法之上

代码:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Scope;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service; import javax.annotation.Resource; public class Main { public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
UserService service=(UserService)applicationContext.getBean("userService");
User user1 = (User) applicationContext.getBean("user");
User user2 = (User) applicationContext.getBean("user");
user1.setName("小明");
user1.setSex("男");
user1.setAge(22); user2.setName("小红");
user2.setSex("女");
user2.setAge(18); service.add(user1);
service.add(user2);
}
} @Repository("user")
@Scope("prototype")
//@Repository用于标注数据访问组件,即DAO组件
//@Scope("prototype")让其每次返回不同的实例,默认是单例
class User {
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private int age; } interface UserDao {
public void add(User user);
} @Controller("userDao")
//@Controller用于标注控制层组件
class UserDaoImp implements UserDao{ @Override
public void add(User user) {
System.out.println(user.getName());
System.out.println(user.getSex());
System.out.println(user.getAge());
} } @Service("userService")
//@Service用于标注业务层组件
class UserService {
//setter注入接口、面向接口编程
private UserDao userdao ;
public void add(User user){
userdao.add(user) ;
}
public UserDao getUserdao() {
return userdao;
}
//注解
@Resource(name="userDao")
public void setUserdao(UserDao userdao) {
this.userdao = userdao;
}
}

bean.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:p="http://www.springframework.org/schema/p"
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"> <context:component-scan
base-package="com.company">
</context:component-scan>
</beans>

结果:

小明

22
小红

18

@Bean跟@Component的区别

这两个还是挺像的

区别是,@Component可以通过类路径扫描自动发现,一般用在被自动扫描和装配的类上。

@Bean主要用在配置类的方法上,来显示声明要生成的类。

@Configuration,在该注释下修饰的类中的方法或者字段,是使用CGLib创建的代理对象对其进行操作。

http://blog.csdn.net/evankaka/article/details/45042397

http://casheen.iteye.com/blog/295348

http://blog.csdn.net/ttjxtjx/article/details/49866011