@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