林炳文Evankaka原创作品。转自https://blog.csdn.net/Evankaka/article/details/44942615


一、基于@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=""/>)

IOC之基于注解的配置bean(上)

@component用法如下:

  1. @Component("userDao")
  2. public class UserDaoImp implements UserDao{
  3. @Override
  4. public void add(User user) {
  5. System.out.println(user.getName());
  6. System.out.println(user.getSex());
  7. System.out.println(user.getAge());
  8. }
  9. }

  在类上使用@Component注解,表示该类定义为Spring管理Bean,使用默认value(可选)属性表示Bean标识符。

相当于:

         <bean id="userDao" class="com.mucfc.dao.UserDao"/>
@Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。

下面写这个是引入component的扫描组件
  1. <!-- 配置的bean所在包的位置 -->
  2. <context:component-scan base-package="com.mucfc" />
其中base-package为需要扫描的包(含所有子包)

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

本文工程免费下载

二、使用实例

User.java:用@Repository注解

  1. package com.mucfc.model;
  2. import org.springframework.context.annotation.Scope;
  3. import org.springframework.stereotype.Repository;
  4. @Repository("user")
  5. @Scope("prototype")
  6. //@Repository用于标注数据访问组件,即DAO组件
  7. //@Scope("prototype")让其每次返回不同的实例,默认是单例
  8. public class User {
  9. private String name;
  10. private String sex;
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public String getSex() {
  18. return sex;
  19. }
  20. public void setSex(String sex) {
  21. this.sex = sex;
  22. }
  23. public int getAge() {
  24. return age;
  25. }
  26. public void setAge(int age) {
  27. this.age = age;
  28. }
  29. private int age;
  30. }
UserDao.java
  1. package com.mucfc.dao;
  2. import com.mucfc.model.User;
  3. public interface UserDao {
  4. public void add(User user);
  5. }
UserDaoImp.java:用@Controller注解
  1. package com.mucfc.daoimp;
  2. import org.springframework.stereotype.Controller;
  3. import com.mucfc.dao.UserDao;
  4. import com.mucfc.model.User;
  5. @Controller("userDao")
  6. //@Controller用于标注控制层组件
  7. public class UserDaoImp implements UserDao{
  8. @Override
  9. public void add(User user) {
  10. System.out.println(user.getName());
  11. System.out.println(user.getSex());
  12. System.out.println(user.getAge());
  13. }
  14. }
UserService.java:用@Service注解
  1. package com.mucfc.service;
  2. import javax.annotation.Resource;
  3. import org.springframework.stereotype.Service;
  4. import com.mucfc.dao.UserDao;
  5. import com.mucfc.model.User;
  6. @Service("userService")
  7. //@Service用于标注业务层组件
  8. public class UserService {
  9. //setter注入接口、面向接口编程
  10. private UserDao userdao ;
  11. public void add(User user){
  12. userdao.add(user) ;
  13. }
  14. public UserDao getUserdao() {
  15. return userdao;
  16. }
  17. //注解
  18. @Resource(name="userDao")
  19. public void setUserdao(UserDao userdao) {
  20. this.userdao = userdao;
  21. }
  22. }

beans.xml'

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-3.0.xsd">
  9. <!-- 配置的bean所在包的位置 -->
  10. <context:component-scan base-package="com.mucfc" />
  11. </beans>

测试下:

  1. package com.mucfc.anno;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import com.mucfc.model.User;
  5. import com.mucfc.service.UserService;
  6. public class Test {
  7. public static void main(String[] args) {
  8. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
  9. UserService service=(UserService)applicationContext.getBean("userService");
  10. User user1 = (User) applicationContext.getBean("user");
  11. User user2 = (User) applicationContext.getBean("user");
  12. user1.setName("小明");
  13. user1.setSex("男");
  14. user1.setAge(22);
  15. user2.setName("小红");
  16. user2.setSex("女");
  17. user2.setAge(18);
  18. service.add(user1);
  19. service.add(user2);
  20. }
  21. }
结果:

IOC之基于注解的配置bean(上)


当在组件类中使用了特定的注解之后,还需要在Spring的配置文件中声明 <context:component-scan>:

  • base-package属性指定一个需要扫描的基类包,Spring容器将会扫描整个基类包里及其子包中的所有类
  • 当需要扫描多个包时,可以使用逗号分隔
  • 如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类,实例: IOC之基于注解的配置bean(上)  
  • <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代码:
  1. @Component("component")
  2. @Lazy(true)
  3. public class TestCompoment {
  4. ……
  5. }

    使用@Lazy注解指定Bean需要延迟初始化。

 

2、@DependsOn:定义Bean初始化及销毁时的顺序,使用方式如下:

 

java代码:
  1. @Component("component")
  2. @DependsOn({"managedBean"})
  3. public class TestCompoment {
  4. ……
  5. }

3、@Scope:定义Bean作用域,默认单例,使用方式如下:

 

java代码:
  1. @Component("component")
  2. @Scope("singleton")
  3. public class TestCompoment {
  4. ……
  5. }

4、@Qualifier:指定限定描述符,对应于基于XML配置中的<qualifier>标签,使用方式如下:

 

java代码:
  1. @Component("component")
  2. @Qualifier("component")
  3. public class TestCompoment {
  4. ……
  5. }

    可以使用复杂的扩展,如@Mysql等等。

 

 

5、@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常,使用方式如下:

 

java代码:
  1. @Component("component")
  2. @Primary
  3. public class TestCompoment {
  4. ……
  5. }

本文工程免费下载




相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-31
  • 2021-10-29
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-07-06
  • 2021-12-22
  • 2022-01-04
  • 2022-02-22
  • 2022-12-23
  • 2022-02-12
  • 2022-12-23
相关资源
相似解决方案