基于注解管理bean


一、基于注解管理bean?

1.标记与扫描

(1)标记:
@Component:将类标识为普通组件
@Controller:将类标识为控制层组件
@Service:将类标识为业务层组件
@Repository:将类标识为持久层组件
这四个注解来分别注解到对应的层次 在spring中四个注解的功能一样,只不过是便于程序员来识别代码

(2)扫描:
扫描组件在xml文件中配置

<context:component-scan base-package=“扫描的包名”></context:component-scan>

标签来进行扫描
由于springMVC在扫描组件的时候不需要扫描控制层,因此在<context:component-scan base-package=“扫描的包名”></context:component-scan>标签中有两个子标签:
①context:exclude-filter:排除扫描
②context:include-filter:包含扫描

    <!--
        context:exclude-filter:排除扫描
        type:设置排除扫描的方式
        type="annotation|assignable"
        annotation:根据注解的类型进行排除,expression需要设置排除的注解的全类名
        assignable:根据类的类型进行排除,expression需要设置排除的类的全类名

        context:include-filter:包含扫描
        注意:需要在context:component-scan标签中设置use-default-filters="false"
        use-default-filters="true"(默认),所设置的包下所有的类都需要扫描,此时可以使用排除扫描
        use-default-filters="false",所设置的包下所有的类都不需要扫描,此时才可以使用包含扫描

    -->

    <!--扫描组件-->
    <context:component-scan base-package="com.atguigu.spring"></context:component-scan>

    <context:component-scan base-package="com.atguigu.spring" use-default-filters="false">
<!--        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
<!--        <context:exclude-filter type="assignable" expression="com.atguigu.spring.controller.UserController"/>-->
<!--        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
    </context:component-scan>

    <bean id="service" class="com.atguigu.spring.service.impl.UserServiceImpl"></bean>

    <bean id="dao" class="com.atguigu.spring.dao.impl.UserDaoImpl"></bean>

通过注解+扫描所配置的bean的id,默认值为类的小驼峰,即类名首字母为小写的结果
可以通过标识组件的注解的value属性值设置bean的自定义的id

二、基于注解的自动装配

自动装配(自动赋值,自动装配bean)
@Autowired注解
在成员变量上直接标记@Autowired注解即可完成自动装配,不需要提供setXxx()方法。

@Autowired :实现自动装配功能的注解
1、@Autowired注解能够标识的位置
a>标识在成员变量上,此时不需要设置成员变量的set方法
b>标识在set方法上
c>标识在为当前成员变量赋值的有参构造上

2、@Autowired注解的原理
a>默认通过byType的方式,在IOC容器中通过类型匹配某个bean为属性赋值
b>若有多个类型匹配的bean,此时会自动转换为byName的方式实现自动装配的效果
即将要赋值的属性的属性名作为bean的id 匹配某个bean为属性赋值
c>若byType和byName的方式都无妨实现自动装配,即IoC容器中有多个类型匹配的bean
且这些 bean的id和要赋值的属性的属性名都不一致,此时抛异常:NouniqueBeanDefinitionException
d>此时可以在要赋值的属性上,添加一个注解@Qualifier
通过该注解的 value属性值,指定某个bean的id,将这个bean为属性赋值

注意:若Ioc容器中没有任何一个类型匹配的bean,此时抛出异常:NoSuchBeanDefinitionException
在@Autowired注解中有个属性required,默认值为true,要求必须完成自动装配
可以将required设置为false,此时能装配则装配,无法装配则使用属性的默认值

3、@Autowired工作流程
在这里插入图片描述
首先根据所需要的组件类型到IOC容器中查找
能够找到唯一的bean:直接执行装配
如果完全找不到匹配这个类型的bean:装配失败
和所需类型匹配的bean不止一个
没有@Qualifier注解:根据@Autowired标记位置成员变量的变量名作为bean的id进行
匹配
能够找到:执行装配
找不到:装配失败
使用@Qualifier注解:根据@Qualifier注解中指定的名称作为bean的id进行匹配
能够找到:执行装配
找不到:装配失败

@Controller
public class UserController {

	@Autowired
	@Qualifier("userServiceImpl")
	private UserService userService;
	
	public void saveUser(){
		userService.saveUser();
	}
}

@Autowired中有属性required,默认值为true,因此在自动装配无法找到相应的bean时,会装
配失败
可以将属性required的值设置为true,则表示能装就装,装不上就不装,此时自动装配的属性为
默认值
但是实际开发时,基本上所有需要装配组件的地方都是必须装配的,用不上这个属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值