Spring——Bean的管理及自动装配


一、Bean的管理及自动装配

bean管理指的是如下的两个操作:

  1. 创建对象
  2. 注入属性

Bean管理操作的两种方式:

  1. 基于xml配置文件的方式实现
  2. 基于注解方式实现

自动装配
我们在做一个类装入属性时,我们都会通过在xml配置文件中,通过property标签中的name属性,指定value属性值,向类中设置值,这个值可以设置成普通类型,也可以设置成对象类型这种方式叫做手动装配

自动装配可以不需要property标签,不需要属性名称和属性值,Spring会帮我们自动的完成属性值的注入。

二、通过xml文件配置

cat类

public class Cat {
    public void shout() {
        System.out.println("miaomiao");
    }
}

dog类

public class Dog {
    public void shout() {
        System.out.println("wangwang");
    }
}

people类

public class People {
    private Dog dog;
    private Cat cat;

    public Dog getDog() {
        return dog;
    }

    public Cat getCat() {
        return cat;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }
}

1.手动配置

<bean id="dog" class="com.zhang.bean.Dog"/>
<bean id="cat" class="com.zhang.bean.Cat"/>

<bean id="people" class="com.zhang.bean.People">
    <property name="dog" ref="dog"/>
    <property name="cat" ref="cat"/>
</bean>

2.byName(根据属性名称注入)

修改配置文件,加上autowire=“byName”

<bean id="people" class="com.zhang.bean.People" autowire="byName">
</bean>

将会根据名字自动寻找属性名相同的实体类,无需再声明属性标记,spring会在people中寻找是否存在cat和dog这个属性,再去IOC容器中寻找cat和dog对象,如果有的话就装配。

注意实体类中的属性名要和id保持一致才能成功装配,假如你的beans.xml文件里面没有配置对应的属性,也是会暴空指针异常的。

3.byType(根据属性类型注入)

修改bean.xml里面的autowire=“byType”,这样就会根据属性的类型自动匹配。
这时候beans.xml中的属性名可以和实体类中的属性名不一致,甚至不设置name属性也能成功输出结果。

<bean id="dog" class="com.zhang.bean.Dog"/>
<bean class="com.zhang.bean.Cat"/>

<bean id="people" class="com.zhang.bean.People" autowire="byType">
</bean>

但是配置中不能出现两条类型相同的bean,否则就会报错。

三、使用注解

什么是注解?

  • 注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值…)
  • 使用注解,注解作用在类上面,方法上面,属性上边
  • 使用注解的目的:简化XML配置

Spring针对Bean管理中创建对象提供的注解

  • @Component 普通的类
  • @Controller 表现层
  • @Service 业务层
  • @Repository 持久层

【注意】上边四个功能一样,都可以用来创建bean实例

1.@Autowired注解

在实体类中的set方法上面添加@Autowired注解

public class People {
    private Dog dog;
    private Cat cat;

    public Dog getDog() {
        return dog;
    }
    @Autowired
    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public Cat getCat() {
        return cat;
    }
    @Autowired
    public void setCat(Cat cat) {
        this.cat = cat;
    }
}
  • @Autowired(required=false)
    说明:false,对象可以为null;true,对象必须存对象,不能为null。

2. @Qualifier注解

配合@Qualifier注解[@Qualifier(value = “xxx”)]使用,可以根据byName的方式自动装配
@Qualifier不能单独使用。

@Autowired
@Qualifier(value = "cat1")
public void setCat(Cat cat) {
    this.cat = cat;
}

3.Resource注解

@Resource(name = “配置对象的id”)

@Resource(name = "cat1")
public void setCat(Cat cat) {
    this.cat = cat;
}

当有name属性时,将按该属性进行byName方式查找装配;
没有name属性时,进行默认的byName方式进行装配;
不成功,byType的方式自动装配
都不成功,报错

@Autowired与@Resource区别:
1.@Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在set方法上。
2.@Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果想使用名称装配可以结合@Qualifier注解进行使用
3.@Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配

@Value 用于注入普通类型(String,int,double等类型)
@Autowired 默认按类型进行自动装配(引用类型)
@Qualifier 不能单独使用必须和@Autowired一起使用,强制使用名称注入
@Resource Java提供的注解,也被支持。使用name属性,按名称注入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring中,bean自动装配有几种方式。一种是通过ByType自动装配,即Spring自动在容器上下文中查找和自己对象属性类型相同的bean,并将其注入到属性中。需要注意的是,所有的bean的class必须唯一,并且这个bean需要和自动注入的属性保持一致。可以在配置文件中使用autowire="byType"来实现这种自动装配方式。\[1\] 另一种方式是使用注解实现自动装配。可以在bean的属性上使用@Autowired注解,Spring自动在容器上下文中查找和属性类型相同的bean,并将其注入到属性中。需要在配置文件中加入context约束,即在配置文件的根元素中添加context命名空间的声明。\[2\]\[3\] 总结起来,Spring中的bean自动装配可以通过ByType自动装配和使用注解实现自动装配两种方式来实现。 #### 引用[.reference_title] - *1* [SpringBean自动装配](https://blog.csdn.net/weixin_44107140/article/details/119154162)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [springbean自动装配(详细)](https://blog.csdn.net/qijing19991210/article/details/119712328)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值