(四)SpringIoc之Bean装配

  1. 在pom.xml的依赖
  <dependencies>
        <!--测试包-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
            <version>4.11</version>
        </dependency>
        <!--spring 上下文-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.0.RELEASE</version>
        </dependency>
        <!--织入包-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.9</version>
        </dependency>
        <!--高速代理生成包-->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.4</version>
        </dependency>

    </dependencies>

2.创建实体类Person和Computer两个实体类

package com.qf.pojo;

public class Computer {
    String disk;
    String cpu;
    String memory;
    String gpu;

    public Computer() {
        System.out.println("空参构造");
    }

    public Computer(String disk, String cpu, String memory, String gpu) {
        this.disk = disk;
        this.cpu = cpu;
        this.memory = memory;
        this.gpu = gpu;
    }

    public String getDisk() {
        return disk;
    }

    public void setDisk(String disk) {
        this.disk = disk;
    }

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public String getGpu() {
        return gpu;
    }

    public void setGpu(String gpu) {
        this.gpu = gpu;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "disk='" + disk + '\'' +
                ", cpu='" + cpu + '\'' +
                ", memory='" + memory + '\'' +
                ", gpu='" + gpu + '\'' +
                '}';
    }
}


package com.qf.pojo;

import java.util.List;

public class Person {
    String name;
    int age;
    Computer computer;
    List<String> girlFriend;

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

    public Computer getComputer() {
        return computer;
    }

    public void setComputer(Computer computer) {
        this.computer = computer;
    }

    public List<String> getGirlFriend() {
        return girlFriend;
    }

    public void setGirlFriend(List<String> girlFriend) {
        this.girlFriend = girlFriend;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", computer=" + computer +
                ", girlFriend=" + girlFriend +
                '}';
    }
}



3.配置spring-config.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">

    <!--Id和name:使用基本一致,name允许有一些特殊字符,name和id都唯一-->
    <!--scope默认为singleton-->
    <!--如果是属性注入,需要为每一个依赖类创建相应的getter和setter方法
-->
    <!--属性装配-->
    <bean class="com.qf.pojo.Computer" name="myComputer" scope="prototype" id="computer1">
        <property name="disk" value="i7 7700HQ"></property>
        <property name="memory" value="16GB"></property>
        <property name="cpu" value="256G SSD 1TB"></property>
        <property name="gpu" value="NVIDIA 1060"></property>
    </bean>

    <!--构造装配,Computer必须有有参构造和无参构造-->
    <bean class="com.qf.pojo.Computer" name="computer">
        <constructor-arg name="cpu" value="i9 9700HQ"></constructor-arg>
        <constructor-arg name="disk" value="512G SSD"></constructor-arg>
        <constructor-arg name="gpu" value="NVIDIA 2080"></constructor-arg>
        <constructor-arg name="memory" value="64G"></constructor-arg>
    </bean>

     <!--自动装配autowire,默认按byType自动装配-->
     <!--下面没有装配Computer,autowire会自动装配-->
    <bean class="com.qf.pojo.Person" name="zhangsan" autowire="byName">
        <property name="name" value="张三"></property>
        <property name="age" value="18"></property>
        <property name="girlFriend">
        <!--集合装配-->
            <list>
                <value>小娜</value>
                <value>小莎</value>
                <value>小琪</value>
            </list>
        </property>
    </bean>

</beans>

自动装配

  • byName:通过反射到Person类,找到没有装配的Computer computer,根据computer和每个bean的name/id匹配,相同就装配,如果没有相同的就抛出异常。
  • byType:通过反射到Person类,找到没有装配的Computer属性, 按Bean的包名.class的class来匹配的,如果有多个class相同抛异常。
  • autowired按byType自动注入.

4.创建测试类TestSpringIoc

public class TestSpringIoc {
    public static void main(String[] args) {
        <!--可以初始化多个xml-->
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-ioc.xml");
       
      
        Computer computer1 =(Computer)context.getBean("computer1");
        System.out.println(computer1);
        
        Person person = (Person)context.getBean("zhangsan",Person.class);
        System.out.println(person);

    }
}


集合装配:如果对应bean的属性是一个集合则需要使用集合装配,Spring支持多种集合装配类型:
  • 对应类型为java.util.List、java.util.Vector 、java.util.Collection 、数组的属性
  • 对应类型为java.util.Set的属性
  • 对应类型为java.util.Map的属性
  • 对应类型为java.util.Properties的属性
示例
<!--List装配:-->
            <property name=“list">
            <list>
            <value>a</value>
            <value>b</value>
            </list>
            </property>
            
   
    <!--Set装配:(HashSet如何去重复,hashCode)-->
            <property name=“set">
            <set>
            <value>a</value>
            <value>b</value>
            </set>
            </property>
            
    <!--Map装配:-->
            <property name=“map">
            <map>
            <entry key="1" value=“a"></entry>
            <entry key="2" value=“b"></entry>
            </map>
            </property>

Annotation注解模式实现装配

1.修改spring-ioc.xml文件

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--声明使用注解开发-->
    <context:annotation-config></context:annotation-config>
    <!--组件扫描,扫描com.qf.pojo,如果含有spring组件注解,将被spring容器管理-->
    <context:component-scan base-package="com.qf.pojo"></context:component-scan>

</beans>

2.创建新的PersonAnnotation类

<!--定义为spring组件-->
@Component("personAnnotation")
public class PersonAnnotation {
    
    @Value("18")
    int age;
    @Value("张三")
    String name;

    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "PersonAnnotation{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}


3.创建新的测试类

public class AnnotationTest {
    public static void main(String[] args) {

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");

        PersonAnnotation personAnnotation = applicationContext.getBean("personAnnotation", PersonAnnotation.class);
        System.out.println(personAnnotation);
    }
}

  • Annotation的优缺点:
    • 优点:灵活、简单、开发效率高
    • 缺点:在不合适的情况下,滥用注解会违反ioc的思想
posted @ 2019-05-18 19:29  奇异果与奇迹果  阅读(201)  评论(0编辑  收藏  举报