spring ioc

目录

spring ioc

1 控制反转,创建对象

1.1  无参构造函数

1.2 set方式

1.3 工厂模式 

2 依赖注入

2.1 手动注入

2.1.1 有参构造函数注入

2.1.2 set方法注入

2.2 自动注入

2.2.1 set 方式自动注入

2.2.2 有参构造函数自动注入

2.3 特殊构造函数注入

 3 测试方法

需要用到的类对象


spring ioc

1 控制反转,创建对象

1.1  无参构造函数

    <!-- 注入接口 -->
    <!-- 无参构造函数 -->
    <!-- score 默认是单例模式 -->
    <bean name="orderService" class="com.sys.yang.standard.OrderServiceImpl" scope="singleton"/>

1.2 set方式

    <!-- 使用 set方式, 方法中不要提供有参构造器,如要要提供构造器,需要提供有参和无参的两种构造器,或者只提供一个无参构造器 -->
    <bean name="orderManagerSet" class="com.sys.yang.standard.OrderManagerSet">
        <property name="orderService" ref="orderService"/>
    </bean>

1.3 工厂模式 

    <!-- 工厂模式 -->
    <bean name="factherFactory" class="com.sys.yang.standard.factory.FactherFactory"/>
    <!-- 创建出 Soon1 对象-->
    <bean name="soon1" factory-bean="factherFactory" factory-method="getSoon1"/>
    <!-- 创建出 Soon2 对象-->
    <bean name="soon2" factory-bean="factherFactory" factory-method="getSoon2"/>

 

2 依赖注入

2.1 手动注入

2.1.1 有参构造函数注入

    <!-- 有参构造函数 -->
    <bean name="studentParam" class="com.sys.yang.standard2.Student">
        <!-- 参数名称, 参数位置,参数类型,  参数值 -->
        <!-- 参数位置, 参数类型,可以用指定,如果在没有冲突的情况下 -->
        <!-- String 是引用的数据类型,需要些全路径 -->
        <constructor-arg name="id" index="0" type="int" value="1"/>
        <constructor-arg name="name" index="1" type="java.lang.String" value="zhangsan"/>
        <constructor-arg name="age" index="2" type="java.lang.String" value="18"/>
    </bean>

2.1.2 set方法注入

    <!-- set 方式注入-->
    <bean name="studentSet" class="com.sys.yang.standard2.Student">
        <property name="id" value="1"/>
        <property name="age" value="10"/>
    </bean>

2.2 自动注入

2.2.1 set 方式自动注入

根据名称进行注入

    <!-- 自动注入, 是根据 set 进行注入  -->
    <!-- autowire byName 根据名字进行注入操作,只能自动注入自己写的实体对象 -->
    <bean name="orderManagerAutoByName" class="com.sys.yang.standard.OrderManagerSet" autowire="byName"/>

 根据类型进行注入

    <!-- 自动注入, 是根据 set 进行注入  -->
    <!-- 根据类型进行注入,只能自动注入自己写的实体对象 -->
    <bean name="orderManagerAutoByType" class="com.sys.yang.standard.OrderManagerSet" autowire="byType"/>

2.2.2 有参构造函数自动注入

有参构造函数自动注入,需要保证有参构造函数的参数都存在,即该 xml 文件中 创建全部参数的 bean 对象

    <!-- 自动注入, 是根据 参构造函数 进行注入 -->
    <!-- 根据id 进行注入,id 没有找的时候根据 name 进行注入-->
    <bean name="orderManagerAutoParam" class="com.sys.yang.standard.OrderManagerSet" autowire="constructor"/>

2.3 特殊构造函数注入

<!-- 特殊函数的构造器,准备参数 -->
    <bean name="socre1" class="com.sys.yang.standard2.Score">
        <!-- property 使用set方法注入 -->
        <!-- <property name="type" value="java"/> -->
        <!-- constructor-arg 使用 有参构造器进行注入 -->
        <constructor-arg name="type" value="java"/>
        <constructor-arg name="level" value="A"/>
    </bean>
    <bean name="socre2" class="com.sys.yang.standard2.Score">
        <constructor-arg name="type" value="C++"/>
        <constructor-arg name="level" value="B"/>
    </bean>
    <bean name="student" class="com.sys.yang.standard2.Student">
        <property name="id" value="1"/>
        <property name="age" value="10"/>
    </bean>
    <!-- 特殊函数的构造器,进行注入 -->
    <bean name="studentDto" class="com.sys.yang.standard2.StudentDto">
        <property name="scoreList">
            <list value-type="com.sys.yang.standard2.Score">
                <ref bean="socre1"/>
                <ref bean="socre2"/>
            </list>
        </property>
        <property name="stringArray">
            <array>
                <value>a</value>
                <value>b</value>
                <value>c</value>
            </array>
        </property>
        <property name="student" ref="student"/>
    </bean>

 3 测试方法

    @Test
    public void test1() {
        /**
         * bean-service.xml 指代的是,xml 文件
         * orderManagerSet 指代的是 bean 标签中的 name 的值
         * <bean name="orderManagerSet" class="com.sys.yang.standard.OrderManagerSet">
         *         <property name="orderService" ref="orderService"/>
         *  </bean>
         */
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean-service.xml");
        OrderManagerSet orderManagerSet = (OrderManagerSet) ac.getBean("orderManagerSet");
        orderManagerSet.getOrder();
    }

注意测试的时候,xml 文件所在的 resource 文件夹,一定要手动的指定为 Resource Root ,否则的话,即使使用绝对路径在测试的时候,也会报 找不到 xml 文件的错误。 

在写的时候,文件夹有点乱,如果直接拷贝 xml 的文件内容,需要手动的修改 class 的路径 

 

需要用到的类对象

/**
 * @author yangLongFei 2020-12-24-15:19
 */
public interface OrderService {
    public void getOrder();
}
/**
 * @author yangLongFei 2020-12-24-15:20
 */
public class OrderServiceImpl implements OrderService {
    @Override
    public void getOrder() {
        System.out.println("this is com.sys.yang.standard.OrderServiceImpl.getOrder ");
    }
}

/**
 * @author yangLongFei 2020-12-24-15:48
 */
public class OrderManagerSet {

    private OrderServiceImpl orderService;

    /**
     * 有参构造器
     */
    public OrderManagerSet(OrderServiceImpl orderService) {
        System.out.println("有参构造器,com.sys.yang.standard.OrderManagerSet.OrderManagerSet(com.sys.yang.standard.OrderServiceImpl)");
        this.orderService = orderService;
    }

    /**
     * 无参构造器
     */
    public OrderManagerSet() {
        System.out.println("无参构造器, com.sys.yang.standard.OrderManagerSet.OrderManagerSet()");
    }

    /**
     * set 方法
     */
    public void setOrderService(OrderServiceImpl orderService) {
        System.out.println("set方法 com.sys.yang.standard.OrderManagerSet.setOrderService");
        this.orderService = orderService;
    }

    public void getOrder() {
        orderService.getOrder();
        System.out.println("this is com.sys.yang.standard.OrderManagerSet");
    }

}
/**
 * @author yangLongFei 2020-12-24-20:34
 */
public interface Father {
    void getSoon();
}
/**
 * @author yangLongFei 2020-12-24-20:35
 */
public class Soon1 implements Father {
    @Override
    public void getSoon() {
        System.out.println("this is com.sys.yang.standard.factory.Soon1");
    }
}
/**
 * @author yangLongFei 2020-12-24-20:35
 */
public class Soon2 implements Father {
    @Override
    public void getSoon() {
        System.out.println("this is com.sys.yang.standard.factory.Soon2 !!!!!!!!!!!!!!!!!!!");
    }
}
/**
 * @author yangLongFei 2020-12-24-20:36
 */
public class FactherFactory {

    public Father getSoon1() {
        return new Soon1();
    }

    public Father getSoon2() {
        return new Soon2();
    }

}

/**
 * @author yangLongFei 2020-12-24-16:52
 */
public class Score {
    private String type;
    private char level;

    public Score() {
    }

    public Score(String type, char level) {
        this.type = type;
        this.level = level;
    }

    @Override
    public String toString() {
        return "Score{" +
                "type='" + type + '\'' +
                ", level=" + level +
                '}';
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public double getLevel() {
        return level;
    }

    public void setLevel(char level) {
        this.level = level;
    }
}

/**
 * @author yangLongFei 2020-12-24-16:10
 */
public class Student {
    private int id;
    private String name;
    private String age;

    private Score score;

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

    public Student() {
        System.out.println("student 无参构造函数 com.sys.yang.standard2.Student.Student()");
    }

    public Student(int id, String name, String age) {
        System.out.println("student 有参构造函数 com.sys.yang.standard2.Student.Student(int, java.lang.String, java.lang.String)");
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Student(int id, String name, String age, Score score) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public String getName() {
        return name;
    }

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

    public Score getScore() {
        return score;
    }

    public void setScore(Score score) {
        this.score = score;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAge() {
        return age;
    }

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

import java.util.Arrays;
import java.util.List;

/**
 * @author yangLongFei 2020-12-24-19:22
 */
public class StudentDto {
    private Student student;
    private List<Score> scoreList;
    private String[] stringArray;

    public StudentDto(Student student, List<Score> scoreList, String[] stringArray) {
        this.student = student;
        this.scoreList = scoreList;
        this.stringArray = stringArray;
    }

    public StudentDto() {

    }


    @Override
    public String toString() {
        return "StudentDto{" +
                "student=" + student +
                ", scoreList=" + scoreList +
                ", stringArray=" + Arrays.toString(stringArray) +
                '}';
    }

    public Student getStudent() {
        return student;
    }

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

    public List<Score> getScoreList() {
        return scoreList;
    }

    public void setScoreList(List<Score> scoreList) {
        this.scoreList = scoreList;
    }

    public String[] getStringArray() {
        return stringArray;
    }

    public void setStringArray(String[] stringArray) {
        this.stringArray = stringArray;
    }
}

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值