Spring笔记04(DI(给属性赋值),自动装配(autowire))

1.DI(给属性赋值)的四种方式:

01.Student实体类:

package cn.pb.bean;

/**
 * 学生实体类
 */
public class Student {
    private  String   name;  //姓名
    private  Integer  age;  //年龄
    private  Grade   grade;  //年级

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", grade=" + grade
                + "]";
    }

    // p 注入的时候 必须要有无参构造
    public Student() {
        super();
    }
    // c 注入的时候 必须要有带参构造
    public Student(String name, Integer age, Grade grade) {
        super();
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
    //p注入的时候 必须要有set()
    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;
    }
    public Grade getGrade() {
        return grade;
    }
    public void setGrade(Grade grade) {
        this.grade = grade;
    }

}

02.Grade实体类:

package cn.pb.bean;

/**
 * 年级实体类
 */
public class Grade {
    private String  name;  //年级名称

    @Override
    public String toString() {
        return "Grade [name=" + name + "]";
    }

    public Grade() {
        super();
    }

    public Grade(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

03.DI注入的方式:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--  配置年级对应的bean-->
      <bean  id="grade" class="com.xdf.bean.Grade">
          <!--01.设值注入 (推荐使用,便于阅读)  在对应的类中必须有set方法,因为底层执行反射机制查询类中对应的setXxx(DI)    -->
          <property name="gradeId" value="1"/>
          <property name="name" value="一年级"/>
      </bean>

    <!--  配置学生对应的bean   02.p命名空间赋值 必须有set()和无参构造
    <bean id="student" class="com.xdf.bean.Student"
          p:age="18" p:name="小黑" p:grade-ref="grade"/>-->

    <!--03.通过构造方法给属性赋值 前提是 必须有对应的带参构造方法  不需要set和get,无参构造也不需要
    <bean id="student"  class="com.xdf.bean.Student">
        001:使用参数的下标
        <constructor-arg index="0" value="xiaohei"/>
        <constructor-arg index="1" value="19"/>
        <constructor-arg index="2" ref="grade"/>
        002:使用参数的名称
        <constructor-arg name="name" value="xiaohei"/>
        <constructor-arg name="age" value="19"/>
        <constructor-arg name="grade" ref="grade"/>
        003:使用参数的默认顺序
        <constructor-arg  value="xiaohei"/>
        <constructor-arg  value="19"/>
        <constructor-arg  ref="grade"/>
    </bean>-->

    <!--04.通过c命名空间(构造方法)给属性赋值 前提是 必须有对应的带参构造方法-->
    <bean id="student"  class="com.xdf.bean.Student"
     c:age="18" c:name="xiaobai" c:grade-ref="grade"/>

</beans>

04.测试代码:

package cn.pb;

import cn.pb.bean.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class StudentTest {
    @Test
    public  void  test01(){
        ApplicationContext context=
                new ClassPathXmlApplicationContext("applicationContext.xml");
        /*
         * 获取容器给我们创建的Student对象   ioc的体现
         *  本身由自身创建对象的过程,把创建对象的权利移交给了spring容器!  IOC  控制反转
         *
         * 之前 Student student=new Student();
         * 现在context.getBean("student");
         * context容器来创建对象了
         *
         */
        Student student=(Student) context.getBean("student");
        System.out.println(student);
    }
}

2.自动装配(autowire):

01.主人实体类:

/**
 * 主人类
 */
public class Person {

     private  String  name; //姓名
     private  int  age; //年龄
     private   Dog  dog;  //主人的宠物
     private   Cat  cat;  //主人的宠物

    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;
    }

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ", dog=" + dog +
                ", cat=" + cat +
                ‘}‘;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {

    }
}

02.宠物狗实体类:

/**
 * 宠物狗类
 */
public class Dog {
    private   String  name;

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Dog{" +
                "name=‘" + name + ‘\‘‘ +
                ‘}‘;
    }
}

03.宠物狗的子类小狗实体类:

/** *继承了宠物狗类 所以宠物狗的非私有的东西 他全有 */public class SmallDog  extends  Dog {

}

04.宠物猫实体类:

/**
 * 小猫咪类
 */
public class Cat {
    private   String  name;

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Dog{" +
                "name=‘" + name + ‘\‘‘ +
                ‘}‘;
    }
}

05.applicationContext.xml配置文件(自动装配):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- autowire  自动装配对象 有两种方式
   01.byName
      spring会根据实体类中的属性名,去找xml文件中id为属性名的bean进行装配!
   02.byType
       spring会根据实体类中的属性类型,去找xml文件中找一个class是 属性类型的类进行装配,
       如果有多个 会报错!
 -->

    <!--配置的主人bean-->
    <bean id="person" class="cn.pb.bean.Person" autowire="byName">
        <property name="age" value="20"/>
        <property name="name" value="xiaohei"/>
          <!--直接引用  autowire属性没有效果  <property name="dog" ref="dog"/>-->
    </bean>

    <!--配置 宠物狗bean-->
    <bean id="dog" class="cn.pb.bean.Dog">
         <property name="name"  value="哈士奇"/>
    </bean>
    <!--配置 小狗bean-->
    <bean id="smallDog" class="cn.pb.bean.SmallDog">
        <!--SmallDog中没有任何属性 ,但是继承父类的name-->
         <property name="name"  value="小狗哈士奇"/>
    </bean>

    <!--主人的第二个宠物 猫咪-->
    <bean id="cat" class="cn.pb.bean.Cat">
        <property name="name"  value="机器锚"/>
    </bean>
</beans>

06.测试代码:

public class PersonDemo {

    public static void main(String[] args) {

        ApplicationContext context=new ClassPathXmlApplicationContext
                ("applicationContext.xml");

      //获取主人信息
        Person person = (Person) context.getBean("person");
        System.out.println(person);
    }

}
时间: 2024-08-14 19:46:17

Spring笔记04(DI(给属性赋值),自动装配(autowire))的相关文章

Spring4-自动装配Beans-按属性名称自动装配

1.创建Maven项目,项目名称springdemo15,如图所示 2.配置Maven,修改项目中的pom.xml文件,修改内容如下 <project xmlns="http://maven.apache.org/POM/4.0.0"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

Spring(二)scope、集合注入、自动装配、生命周期

原文链接:http://www.orlion.ga/189/ 一.scope bean的scope属性中常用的有两种:singleton(单例,默认)和prototype(原型,每次创建新对象) 例:beans.xml <bean id="userService" class="ml.orlion.service.UserService" scope="prototype">     <property name="u

大厂面试官问你META-INF/spring.factories要怎么实现自动扫描、自动装配?

大厂面试官问你META-INF/spring.factories要怎么实现自动扫描.自动装配? 很多程序员想面试进互联网大厂,但是也有很多人不知道进入大厂需要具备哪些条件,以及面试官会问哪些问题,这里今天就给大家分享一下,如果大厂面试官问你META-INF/spring.factories要怎么实现自动扫描.自动装配,你需要怎么回答? 程序员应聘面试经验技巧和注意事项你知道哪些? 1.基础很重要,不要生疏了. 2.要关注技术前沿. 3.小公司比较看重知识的广度,大公司更看重知识的深度. 4.良好

Spring注解 - 生命周期、属性赋值、自动装配

一.Bean的生命周期 流程 Bean创建 -- 初始化 -- 销毁 创建: 单实例:在容器启动时创建对象 多实例:每次调用时创建对象 初始化: 都是在对象创建完成后,调用初始化方法 销毁: 单实例:容器关闭时,调用销毁方法 多实例:容器不会管理这个bean,只能手动调用销毁方法 实现方式 在 @Bean 注解上指定初始化(initMethod).销毁方法(destroyMethod) @Bean(initMethod = "init", destroyMethod = "d

Spring - bean的autowire属性(自动装配)

当我们要往一个bean的某个属性里注入另外一个bean,我们会使用<property> + <ref/>标签的形式.但是对于大型项目,假设有一个bean A被多个bean引用注入,如果A的id因为某种原因修改了,那么所有引用了A的bean的<ref/>标签内容都得修改,这时候如果使用autowire="byType",那么引用了A的bean就完全不用修改了.autowire到底都什么用?我们继续往下看. autowire的用法: <bean i

Spring_用Spring容器创建对象并给属性赋值

创建spring配置文件:spring-config.xml.对象的创建和赋值都在这里进行配置. 创建实体类,设置属性 import java.util.List; import java.util.Map; public class BookBean { private Long bookId; private String bookName; private Float price; private List<String> fzb; private Map<String,Strin

Spring学习记录(十一)---使用注解和自动装配

Spring支持用注解配置Bean,更简便. 上面的组件,是根据实际情况配的.比如写的一个类,是做业务处理的,那就用注解@Service表示服务层组件,以此类推.将整体分成不同部分. 要在xml加入context命名空间 1 <!-- 指定Spring IOC容器扫描的包 --> 2 <context:component-scan base-package="package com.guigu.spring.beans.annotation"></cont

使用Spring的JavaConfig 和 @Autowired注解与自动装配

1 JavaConfig  配置方法 之前我们都是在xml文件中定义bean的,比如: 1 2 3 4 5 6 7 8 <beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://www.springframework

[干货][EMIT]千行代码实现代理式AOP+属性的自动装配

其实说起AOP,我在2011年的时候就发过一个帖子,CSDN的地址为http://bbs.csdn.net/topics/370067862,只是那时候对EMIT了解的深度不够,所以内容显得有些稚嫩,但对于我来说,意义很大.从那个时候开始起我算对EMIT入门了. 不扯远了,回到正题上来.AOP的实现方式是分2种的,一种是继承式的,这种实现的方式需要注入的方法上打上virtual,这样子类才能继承并重写它,如下图所示: 第二种就是代理式的,代理式的注入一般是需要有抽象的接口的,其大致的实现原理如下