byName自动装配和byType自动装配以及Autowired自动装配

给对象的属性赋值的方式不再是手动的,由容器自动赋值

下面先演示手动注入,然后再介绍自动注入

手动注入:

先创建两个类,一个Cat类,一个Dog类

public class Cat
{
    public  void  shout()
    {
        System.out.println("miao~");
    }
}
public class Dog
{
    public  void  shout()
    {
        System.out.println("wang~");
    }
}


然后创建一个People类,上面两个类的对象都是这个类的属性,表示一个人养了一只猫和一只狗

public class People
{
    private Cat cat;
    private Dog dog;
    private String name;
 
    public Cat getCat() {
        return cat;
    }
 
    public void setCat(Cat cat) {
        this.cat = cat;
    }
 
    public Dog getDog() {
        return dog;
    }
 
    public void setDog(Dog dog) {
        this.dog = dog;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}

web.xml文件里面:

//new一个Cat类的对象cat1    
<bean id="cat1"  class="com.kuang.pojo.Cat"/>
 
//new一个Dog类的对象dog1
<bean id="dog1"  class="com.kuang.pojo.Dog"/>
 
 
//new一个People类的对象people1,并且给他的两个属性cat赋值cat1对象,dog赋值dog1对象
<bean id="people1"  class="com.kuang.pojo.People">
     <property name="name"  value="欧阳水鸣"/>
     <property name="cat"   ref="cat1"/>
     <property name="dog"  ref="dog1"/>
</bean>

自动装配:
1.byName自动装配:

People类的对象people1里面有两个属性是别的类的对象(Dog,Cat类)
容器会遍历容器里面每一个对象的id,如果这个对象的id是Dog类的首字母小写dog,Cat类的首字母cat,就把这个对象赋值给people1的两个属性

但是你如果id叫dog111,或者cat2,这样是识别不出来的,无法赋值成功,id只能是类的名字首字母小写,这是严格规定的

//new一个Cat类的对象cat1    
<bean id="cat"  class="com.kuang.pojo.Cat"/>
 
//new一个Dog类的对象dog1
<bean id="dog"  class="com.kuang.pojo.Dog"/>
 
 
//new一个People类的对象people1,并且给他的两个属性cat赋值cat1对象,dog赋值dog1对象
<bean id="people1"  class="com.kuang.pojo.People"  autowire="byName">
     <property name="name"  value="欧阳水鸣"/>
</bean>


2.byType自动装配

People类的对象people1里面有两个属性是别的类的对象(Dog,Cat类)
容器会遍历容器里面每一个对象,查询这个对象所属的类,如果这个对象所属的类是Dog类,或者是Cat类,就把这个对象赋值给people1的两个属性

所以不管容器内bean的id叫什么,只要它是Dog类的对象和Cat类的对象,就能赋值成功

所以这要求在容器内,一个类只能有一个对象,不能一个类new出多个对象,要不然不知道赋哪个值

//new一个Cat类的对象cat1    
<bean id="cat333"  class="com.kuang.pojo.Cat"/>
 
//new一个Dog类的对象dog1
<bean id="dog123"  class="com.kuang.pojo.Dog"/>
 
 
//new一个People类的对象people1,并且给他的两个属性cat赋值cat1对象,dog赋值dog1对象
<bean id="people1"  class="com.kuang.pojo.People"  autowire="byType">
     <property name="name"  value="欧阳水鸣"/>
</bean>

3.Autowired自动装配

beans.xml文件中非常简洁:

    <bean id="cat"  class="com.kuang.pojo.Cat"/>

    <bean id="dog"  class="com.kuang.pojo.Dog"/>


    <bean id="people"  class="com.kuang.pojo.People"/>

在People类中加两个注解即可 :

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

    private String name;

    public Cat getCat() {
        return cat;
    }

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

    public Dog getDog() {
        return dog;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

注意:Autowired可以和Qualifier连起来用:指定一个bean对象注入

    <bean id="cat1111"  class="com.kuang.pojo.Cat"/>
    <bean id="cat2222"  class="com.kuang.pojo.Cat"/>
    <bean id="cat2222"  class="com.kuang.pojo.Cat"/>



    <bean id="dog123"  class="com.kuang.pojo.Dog"/>
    <bean id="people"  class="com.kuang.pojo.People"/>
public class People
{
    @Autowired
    @Qualifier(value="cat1111")
    private Cat cat;
    @Autowired
    private Dog dog;

    private String name;

    public Cat getCat() {
        return cat;
    }

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

    public Dog getDog() {
        return dog;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Autowired和Resource两个注解的区别:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值