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有什么区别
- 都是将自定义的bean对象添加到IOC容器中
- @Controller:控制器,推荐给controller层添加此注解
- @Service:业务逻辑,推荐给业务逻辑层添加此注解
- @Repository:仓库管理,推荐给数据访问层添加此注解
- @Component:给不属于以上基层的组件添加此注解
- 注意:我们虽然人为的给不同的层添加不同的注解,但是在spring看来,可以在任意层添 加任意注解, spring底层是不会给具体的层次验证注解,这样写的目的只是为了提高可读性还有可以方便管理,最偷懒的 方式
当使用@Autowired匹配到多个类型怎么解决
使用@Autowired来实现自动注入
·默认优先根据类型去匹配
·如果匹配到多个类型则会按照名字匹配
·如果名又没有匹配到则会报错:
- 可以去修改属性的名字对应bean的名字:userServiceImpl
- 可以去修改Bean的名字对应属性的名字:@Service("userService")
- 可以通过@Qualifier设置属性的名字(覆盖) :@Qalifier("userServiceImpl")
- 设置其中一个Bean为主要的自动注入Bean:@Primary
- 使用泛型作为自动注入限定符
- 改用@Resource(name = "userServiceImpl")
使用@Resource来实现自动注入
- 默认优先根据名字去匹配,如果其他类使用了该类的名字则报错
- 如果名字没匹配到,则会根据类型匹配
- 如果类型还匹配到多个,则报错
@Autowired 和 @Resource 的区别
- @AutoWired:是spring中提供的注解,@Resource:是jdk中定义的 注解,依靠的是java的标准
- @AutoWired默认是按照类型进行装配,默认情况下要求依赖的对 象必须存在,@Resource默认是按照名字进行匹配的,同时可以指定name属 性。
- @AutoWired只适合spring框架,而@Resource扩展性更好
我成功因为我志在成功
浙公网安备 33010602011771号