通过bean标签创建对象,给对象的属性赋值,自动注入

1.创建对象

(1)有一个接口SomeService:

public interface SomeService
{
    void doSome();
}

(2)一个类SomeServiceImpl实现了这个接口:

public class SomeServiceImpl implements SomeService
{
    @Override
    public void doSome()
    {
        System.out.println("执行了SomeServiceImpl的doSome()方法");
    }
}

(3)在spring的配置文件beans.xml中创建了一个SomeServiceImpl类的对象,id叫someService

<beans>
    <bean id="111"  class="com.bjpowernode.service.impl.SomeServiceImpl">

    </bean>
</beans>

(4)在我们编写的测试类中输入以下代码:

public class AppMain
{
    public static void main(String[] args)
    {
        //表明这个spring配置文件编译后最终是在target/classes/beans.xml
        String config="beans.xml";

        //指定好spring配置文件的所在位置后需要创建一个容器对象
        ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
        //此时这个ctx就是一个容器对象,通过这个容器对象就可以获取某个java对象

        //从容器中获取指定名称的java对象,通过getBean(bean的id)方法获取指定名称的java对象
        SomeService a= (SomeService) ctx.getBean("111");
        //此时a就是一个SomeServiceImpl类的对象

        //调用方法
        a.doSome();
    }
}

注意:在创建容器对象,即ApplicationContext ctx=new ClassPathXmlApplicationContext(config);

得到一个容器对象的时候,会把配置文件中所有的java对象都创建出来(即有几个bean标签就创建几个java对象)

2.创建完对象之后,给对象的属性赋值

(1)set注入(也叫设值注入)这种方法用的比较多,推荐使用这种方法

有一个类叫作Student,里面有两个属性name和age:

public class Student
{
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

在配置文件xml文件里面:在property标签里面,name的值表示属性名,value的值表示属性的值

<bean id="myStudent"  class="com.bjpowernode.ba01.Student">
       <property name="name" value="李四"/>
       <property name="age" value="20"/>
</bean>

运行测试代码:

        String config="ba01/applicationContext.xml";
        ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
        Student student= (Student) ctx.getBean("myStudent");
        System.out.println(student.getAge());
        System.out.println(student.getName());

之所以叫作set注入是因为会调用类里面的setName方法和setAge方法,所以如果你的setName方法和setAge方法里面如果没有对属性进行赋值,那么即使你在xml文件里面进行了set注入

<bean id="myStudent"  class="com.bjpowernode.ba01.Student">
       <property name="name" value="李四"/>
       <property name="age" value="20"/>
</bean>

 这个myStudent对象的name属性和age属性还是没有被赋值

3.自动注入

首先,情境是一个类的属性之一是另一个类的对象:(Student类的对象的属性之一是一个School类对象)

首先有一个类School,这个类里面有两个属性,name和address(表示一个学校的名字和地址)

public class School
{
    private String name;
    private String address;

    public String getName() {
        return name;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

然后另一个类是Student,这个类里面有三个属性,name,age还有一个School类属性school

public class Student
{
    private String name;
    private Integer age;
    private School school;


    public School getSchool() {
        return school;
    }

    public void setSchool(School school) {
        this.school = school;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

而在配置文件中:

    <bean id="mySchool" class="com.bjpowernode.ba01.School">
        <property name="name"   value="北京大学"/>
        <property name="address"   value="海淀校区"/>
    </bean>

    <bean id="myStudent"  class="com.bjpowernode.ba01.Student">
        <property name="name" value="李四"/>
        <property name="age" value="20"/>
        <property name="school" ref="mySchool"/>
    </bean>

一个bean表示一个java对象,所以这里在配置文件中定义了两个java对象

其中Student类对象myStudent有一个属性叫作student,它是一个java对象,一个id为mySchool的java对象(属性是一个对象)

运行如下代码:

        String config="ba01/applicationContext.xml";
        ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
        //上面创建好了一个容器对象
        
        //下面创建一个Student类对象
        Student student= (Student) ctx.getBean("myStudent");
        
        //Student类里面有三个属性:name,age,school(其中school是一个School类对象)
        System.out.println(student.getAge());
        System.out.println(student.getName());
        System.out.println(student.getSchool().getName());
        System.out.println(student.getSchool().getAddress());

 

这种通过ref指定   属性是id为xxx的某个java对象,其实是手工注入

    <bean id="mySchool" class="com.bjpowernode.ba01.School">
        <property name="name"   value="北京大学"/>
        <property name="address"   value="海淀校区"/>
    </bean>

    <bean id="myStudent"  class="com.bjpowernode.ba01.Student">
        <property name="name" value="李四"/>
        <property name="age" value="20"/>
        <property name="school" ref="mySchool"/>
    </bean>

3.下面介绍什么是自动注入:

1.byName自动注入

School类和Student类不变

xml配置文件改变:不再用ref了,而是用autowire:

而且将School类对象的id从mySchool改为school了

    <bean id="school" class="com.bjpowernode.ba01.School">
        <property name="name"   value="北京大学"/>
        <property name="address"   value="海淀校区"/>
    </bean>

    <bean id="myStudent"  class="com.bjpowernode.ba01.Student" autowire="byName">
        <property name="name" value="李四"/>
        <property name="age" value="20"/>
    </bean>

 spring在创建id为myStudent这个对象的时候,发现autowire是byName,于是在给school这个属性赋值的时候,会去寻找有没有哪个java类对象的id叫作school,在整个容器内寻找这个java对象

重点java对象的id必须等于属性名

2.byType自动注入

spring在创建id为myStudent这个对象的时候,发现autowire是byType,于是在给school这个属性赋值的时候,会去寻找每个对象的类型是不是School,(因为school这个属性是一个School类对象),发现这个id叫作myschool的java对象它是一个School类对象,所以就是这个对象了

    <bean id="mySchool" class="com.bjpowernode.ba01.School">
        <property name="name"   value="北京大学"/>
        <property name="address"   value="海淀校区"/>
    </bean>

    <bean id="myStudent"  class="com.bjpowernode.ba01.Student" autowire="byType">
        <property name="name" value="李四"/>
        <property name="age" value="20"/>
    </bean>

总结:1.byName是去比对每一个java bean的id,看属性名和这些id是否相同

2.byType是去比对每一个java bean的class,看属性属于的类A和这些对象属于的类是否相同

(或者一个java对象它所属的类是类A的子类,即继承xxx类也行)

3.不管是byName还是byType符合条件的都只能有一个java类对象,如果容器内多个java对象都符合,那就会报错

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值