#
# [林炳文Evankaka](http://blog.csdn.net/evankaka)原创作品。转载请注明出处[http://blog.csdn.net/evankaka](http://blog.csdn.net/evankaka)
一、基于@Component注解的配置
Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。
在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。
虽然目前这3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用上述注解对分层中的类进行注释。
1、@controller 控制器(注入服务)
2、@service 服务(注入dao)
3、@repository dao(实现dao访问)
4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)

@component用法如下:
~~~
@Component("userDao")
public 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());
}
}
~~~
**在类上使用@Component注解,表示该类定义为Spring管理Bean,使用默认value(可选)属性表示Bean标识符。**
相当于:
~~~
<bean id="userDao" class="com.mucfc.dao.UserDao"/>
~~~
@Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。
下面写这个是引入component的扫描组件
~~~
<!-- 配置的bean所在包的位置 -->
<context:component-scan base-package="com.mucfc" />
~~~
其中base-package为需要扫描的包(含所有子包)
**@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 **
[本文工程免费下载](http://download.csdn.net/detail/evankaka/8714879)
# 二、使用实例
**User.java:用@Repository注解**
~~~
package com.mucfc.model;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
@Repository("user")
@Scope("prototype")
//@Repository用于标注数据访问组件,即DAO组件
//@Scope("prototype")让其每次返回不同的实例,默认是单例
public 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;
}
~~~
UserDao.java
~~~
package com.mucfc.dao;
import com.mucfc.model.User;
public interface UserDao {
public void add(User user);
}
~~~
**UserDaoImp.java:用@Controller注解**
~~~
package com.mucfc.daoimp;
import org.springframework.stereotype.Controller;
import com.mucfc.dao.UserDao;
import com.mucfc.model.User;
@Controller("userDao")
//@Controller用于标注控制层组件
public 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());
}
}
~~~
**UserService.java:用@Service注解**
~~~
package com.mucfc.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.mucfc.dao.UserDao;
import com.mucfc.model.User;
@Service("userService")
//@Service用于标注业务层组件
public 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;
}
}
~~~
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: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">
<!-- 配置的bean所在包的位置 -->
<context:component-scan base-package="com.mucfc" />
</beans>
~~~
测试下:
~~~
package com.mucfc.anno;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mucfc.model.User;
import com.mucfc.service.UserService;
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.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);
}
}
~~~
结果:

当在组件类中使用了特定的注解之后,还需要在Spring的配置文件中声明 <context:component-scan>:
- base-package属性指定一个需要扫描的基类包,Spring容器将会扫描整个基类包里及其子包中的所有类
- 当需要扫描多个包时,可以使用逗号分隔
- 如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类,实例: 
- <context:include-filter>子节点表示要包含的目标类
- <context:exclude-filter>子节点表示要排除在外的目标类
- <context:component-scan>下可以拥有若干个<context:include-filter>和<context:exclude-filter>子节点
- <context:include-filter>和<context:exclude-filter>子节点支持多种类型的过滤表
# 三、更多的配置元数据
**1、@Lazy:**定义Bean将延迟初始化,使用方式如下:
java代码:
~~~
@Component("component")
@Lazy(true)
public class TestCompoment {
……
}
~~~
使用@Lazy注解指定Bean需要延迟初始化。
2、**@DependsOn:**定义Bean初始化及销毁时的顺序,使用方式如下:
java代码:
~~~
@Component("component")
@DependsOn({"managedBean"})
public class TestCompoment {
……
}
~~~
**3、@Scope**:定义Bean作用域,默认单例,使用方式如下:
java代码:
~~~
@Component("component")
@Scope("singleton")
public class TestCompoment {
……
}
~~~
**4、@Qualifier:**指定限定描述符,对应于基于XML配置中的<qualifier>标签,使用方式如下:
java代码:
~~~
@Component("component")
@Qualifier("component")
public class TestCompoment {
……
}
~~~
可以使用复杂的扩展,如@Mysql等等。
**5、@Primary:**自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常,使用方式如下:
java代码:
~~~
@Component("component")
@Primary
public class TestCompoment {
……
}
~~~
#
[本文工程免费下载](http://download.csdn.net/detail/evankaka/8714879)
# [林炳文Evankaka](http://blog.csdn.net/evankaka)原创作品。转载请注明出处[http://blog.csdn.net/evankaka](http://blog.csdn.net/evankaka)
- 前言
- Spring配置及第一个Spring HelloWorld
- Spring之IOC的注入方式总结
- Spring之IOC自动装配解析
- Spring之Construcotrer注入和setter注入不同的XML写法方式
- Spring之核心容器bean
- IOC之基于注解的配置bean(上)
- IOC之方法注入讲解
- IOC之bean之间的关系讲解
- IOC之基于注解的配置bean(下)
- IOC之基于Java类的配置Bean
- AOP之JDK动态代理和CGLib动态代理
- AOP之5种增强方法应用范例
- AOP之基于Schema配置总结与案例
- AOP之基于AspectJ注解总结与案例
- Spring JDBC原理与应用实例讲解
- Spring事务管理——使用XML配置声明式事务
- Spring+SpringMVC+Mybatis+Mysql整合实例
- Spring+Mybatis+SpringMVC+Maven+MySql搭建实例
