work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SpringBoot bean解析

Posted on 2020-02-23 22:23  work hard work smart  阅读(314)  评论(0编辑  收藏  举报

IOC思想介绍

xml方式配置bean

注解方式配置bean

refresh方法解析

bean实例化解析

 

一、IOC思想

举例说明

假设有一个animal类有两个实现类Dog和Cat

Animal animal = new Dog();

Animal animal = new Cat();

 

使用IOC。 不需要自己实例对象

@Autowired

Animal animal、

 

IOC优点

1、松耦合

2、灵活性提高

3、可维护性提高

 

二、bean的配置方式

1、xml

2、注解

 

1、xml方式配置方式

优点: 低耦合,对象关系清晰,集中管理

缺点: 配置繁琐,开发效率稍低,文件解析耗时

 

1) 无参构造

2)有参构造

3) 静态工厂方法

4) 实例工厂方法

 

 1无参构造

1.1)创建Student类

public class Student
{
    private String name;
    private  Integer age;
    private List<String> classList;

    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 List<String> getClassList() {
        return classList;
    }

    public void setClassList(List<String> classList) {
        this.classList = classList;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", classList=" + String.join(",", classList) +
                '}';
    }
}

  

1.2) 创建HelloService类

public class HelloService {

    private Student student;

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    public String hello(){
        return  student.toString();
    }
}

  

1.3) resources/ioc文件夹下配置demo.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">
        <bean id="student" class="com.example.demo.ioc.xml.Student">
            <property name="name" value="zhangsan" />
            <property name="age" value="13" />
            <property name="classList">
                <list>
                    <value>math</value>
                    <value>english</value>
                </list>
            </property>
        </bean>

        <bean id="helloServie" class="com.example.demo.ioc.xml.HelloService">
            <property name="student" ref="student" />
         </bean>
</beans>

  

4) 测试

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(locations = "classpath:ioc/demo.xml")
public class BeansTest {


    @Autowired
    private HelloService helloService;



    @Test
    public void contextLoads() {
    }

    @Test
    public void testHello() {
        System.out.println(helloService.hello());
    }
}

  

5) 输出结果

Student{name='zhangsan', age=13, classList=math,english}

  

2有参构造

1)Student类增加构造函数

public class Student
{
    private String name;
    private  Integer age;
    private List<String> classList;

    public Student(String name, Integer age) {
        this.name = name;
        this.age = 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;
    }

    public List<String> getClassList() {
        return classList;
    }

    public void setClassList(List<String> classList) {
        this.classList = classList;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", classList=" + String.join(",", classList) +
                '}';
    }
}

  

2)demo.xml修改如下

 

 

3) 输出结果

Student{name='zhangsan', age=13, classList=math,english}

  

 3 静态工厂方法

1)、创建抽象类Animal

public abstract class Animal {
    abstract String getName();
}

  

2)、创建两个实现类Cat和Dog

public class Cat extends  Animal {
    @Override
    String getName() {
        return "Cat";
    }
}

  

public class Dog extends  Animal {
    @Override
    String getName() {
        return "Dog";
    }
}

  

3)创建工厂类

public  class AnimalFactory {

    public static  Animal getAnimal(String type){
        if("dog".equals(type)){
            return  new Dog();
        }else {
            return  new Cat();
        }
    }
}

  

4)在HelloService类中增加引用

 

5) 配置demo.xml

 

 

6)测试

 

 

 输出结果:

Dog

  

4、 实例工厂方法

1)AnimalFactory改造如下

 

 

 2)xml配置改造如下

 

 

3、测试

Cat