Spring(三) 注解开发的几个问题

怎么开启注解装配

<!--开启注解扫描-->
<context:component-scan base-package="com.jiang">
    <!--根据注解排除扫描-->
    <!--<context:exclude-filter type="annotation" 
		expression="org.springframework.stereotype.Controller"/>-->
    <!--根据类名排除扫描-->
    <!--<context:exclude-filter type="assignable" 
  		expression="com.jiang.controller.UserController"/>-->
    <!--根据正则表达式(regex),切面(aspectj),自己实现一个类(custom),比较少用-->
    <!--同理可以根据注解,类名,正则表达式,切面,自己实现一个类来包含扫描-->
    <!--<context:include-filter type="annotation" 
		expression="org.springframework.stereotype.Controller"/>-->
</context:component-scan>

@Controller,@Service,@Repository,@Component有什么区别

  1. 都是将自定义的bean对象添加到IOC容器中
  2. @Controller:控制器,推荐给controller层添加此注解
  3. @Service:业务逻辑,推荐给业务逻辑层添加此注解
  4. @Repository:仓库管理,推荐给数据访问层添加此注解
  5. @Component:给不属于以上基层的组件添加此注解
  6. 注意:我们虽然人为的给不同的层添加不同的注解,但是在spring看来,可以在任意层添 加任意注解, spring底层是不会给具体的层次验证注解,这样写的目的只是为了提高可读性还有可以方便管理,最偷懒的 方式

当使用@Autowired匹配到多个类型怎么解决

使用@Autowired来实现自动注入
·默认优先根据类型去匹配
·如果匹配到多个类型则会按照名字匹配
·如果名又没有匹配到则会报错:

  1. 可以去修改属性的名字对应bean的名字:userServiceImpl
  2. 可以去修改Bean的名字对应属性的名字:@Service("userService")
  3. 可以通过@Qualifier设置属性的名字(覆盖) :@Qalifier("userServiceImpl")
  4. 设置其中一个Bean为主要的自动注入Bean:@Primary
  5. 使用泛型作为自动注入限定符
  6. 改用@Resource(name = "userServiceImpl")

使用@Resource来实现自动注入

  • 默认优先根据名字去匹配,如果其他类使用了该类的名字则报错
  • 如果名字没匹配到,则会根据类型匹配
  • 如果类型还匹配到多个,则报错

@Autowired 和 @Resource 的区别

  1. @AutoWired:是spring中提供的注解,@Resource:是jdk中定义的 注解,依靠的是java的标准
  2. @AutoWired默认是按照类型进行装配,默认情况下要求依赖的对 象必须存在,@Resource默认是按照名字进行匹配的,同时可以指定name属 性。
  3. @AutoWired只适合spring框架,而@Resource扩展性更好
posted @ 2021-02-24 00:12  阿灿呀  阅读(79)  评论(0)    收藏  举报