注解装配Bean

@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

原文地址:https://www.cnblogs.com/hongdada/p/6433656.html