Spring学习(二)注解配置

Spring学习(二)注解配置

Spring学习(二)注解配置_第1张图片

1、注解标识组件

  1. 普通组件:@Component (常用于用于除以下的其他层)

    标识一个受Spring IOC容器管理的组件

  2. 持久化层组件:@Respository (常用于Dao层

    标识一个受Spring IOC容器管理的持久化层组件

  3. 业务逻辑层组件:@Service (常用于Service

    标识一个受Spring IOC容器管理的业务逻辑层组件

  4. 表述层控制器组件:@Controller (常用于servlet层

    标识一个受Spring IOC容器管理的表述层控制器组件

  5. 组件命名规则

    • 默认情况:使用组件的简单类名首字母小写后得到的字符串作为bean的id
    • 使用组件注解的value属性指定bean的id

注意:事实上Spring并没有能力识别一个组件到底是不是它所标记的类型,即使将@Respository注解用在一个表述层控制器组件上面也不会产生任何错误,所以@Respository、@Service、@Controller这几个注解仅仅是为了让开发人员自己明确当前的组件扮演的角色。

2、组件扫描

只通过上面的注解标识后 还需要通过Spring扫描才能够侦测到


<context:component-scan base-package="com.song">context:component-scan>
  • base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包及其子包中的所有类。
  • 当需要扫描多个包时可以使用逗号分隔。
  • 如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类
<context:component-scan 
	base-package="com.song" 
	resource-pattern="autowire/*.class"/>
  • 包含与排除

    • context:include-filter子节点表示要包含的目标类

      注意:通常需要与use-default-filters属性配合使用才能够达到“仅包含某些组件”这样的效果。即:通过将use-default-filters属性设置为false,禁用默认过滤器,然后扫描的就只是include-filter中的规则指定的组件了。

    • context:exclude-filter子节点表示要排除在外的目标类

    • component-scan下可以拥有若干个include-filter和exclude-filter子节点

    类别 示例 说明
    annotation com.song.XxxAnnotation 过滤所有标注了XxxAnnotation的类。这个规则根据目标组件是否标注了指定类型的注解进行过滤。
    assignable com.song.BaseXxx 过滤所有BaseXxx类的子类。这个规则根据目标组件是否是指定类型的子类的方式进行过滤。
    aspectj com.song.*Service+ 所有类名是以Service结束的,或这样的类的子类。这个规则根据AspectJ表达式进行过滤。
    regex com.song.anno.* 所有com.song.anno包下的类。这个规则根据正则表达式匹配到的类名进行过滤。
    custom com.song.XxxTypeFilter 使用XxxTypeFilter类通过编码的方式自定义过滤规则。该类必须实现org.springframework.core.type.filter.TypeFilter接口

3、组件装配

需求

Controller组件中往往需要用到Service组件的实例,Service组件中往往需要用到Repository组件的实例。Spring可以通过注解的方式帮我们实现属性的装配。

实现依据

在指定要扫描的包时,context:component-scan 元素会自动注册一个bean的后置处理器:AutowiredAnnotationBeanPostProcessor的实例。该后置处理器可以自动装配标记了**@Autowired**、@Resource或@Inject注解的属性。

@Autowired

  1. 根据类型实现自动装配。
  2. 构造器、普通字段(即使是非public)、一切具有参数的方法都可以应用@Autowired注解
  3. 默认情况下,所有使用@Autowired注解的属性都需要被设置。当Spring找不到匹配的bean装配属性时,会抛出异常。
  4. 若某一属性允许不被设置,可以设置@Autowired注解的required属性为 false
  5. 默认情况下,当IOC容器里存在多个类型兼容的bean时,Spring会尝试匹配bean的id值是否与变量名相同,如果相同则进行装配。如果bean的id值不相同,通过类型的自动装配将无法工作。此时可以在@Qualifier注解里提供bean的名称。Spring甚至允许在方法的形参上标注@Qualifiter注解以指定注入bean的名称。
  6. @Autowired注解也可以应用在数组类型的属性上,此时Spring将会把所有匹配的bean进行自动装配。
  7. @Autowired注解也可以应用在集合属性上,此时Spring读取该集合的类型信息,然后自动装配所有与之兼容的bean。
  8. @Autowired注解用在java.util.Map上时,若该Map的键值为String,那么 Spring将自动装配与值类型兼容的bean作为值,并以bean的id值作为键。

@Resource

@Resource注解要求提供一个bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为bean的名称。

@Inject

@Inject和@Autowired注解一样也是按类型注入匹配的bean,但没有reqired属性

4、使用Autowired实现自动装配

@Repository
public class UserDao {

    public void show(){
        System.out.println("我是Dao层的show方法");
    }
}
@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    public void showDao(){
        System.out.println("Service层的showDao方法 正在调用:");
        userDao.show();
    }
}
@Controller
public class UserServlet {

    @Autowired
    private UserService userService;

    public void ShowService(){
        System.out.println("Servlet的ShowService方法 正在调用:");
        userService.showDao();
    }
}

测试

 @Test
    public void test01(){
        ApplicationContext context = new  ClassPathXmlApplicationContext("beans.xml");

        UserServlet bean = context.getBean(UserServlet.class);

        bean.ShowService();
    }

若想了解更多的Spring建议查看 Spring官网

Spring下载地址

推荐学习Spring的视频 B站 遇见狂神说 或者 尚硅谷
谢谢大家的阅读! 若上面有写错的 欢迎纠正哦!

你可能感兴趣的:(Spring学习(二)注解配置)