01-spring-依赖注入,控制反转

starrylsi
2024-09-10 / 0 评论 / 10 阅读 / 正在检测是否收录...

目标: 理解Spring IOC,DI
注: 面向有开发经验的,小白应该看不懂
错误: JUnit版本与语句不对应导致代码正确,运行错误

知识点

控制反转:IOC——Inversion of Control,指的是将对象的创建权交给Spring去创建。使用Spring之前,对象的创建都是由我们自己在代码中new创建。而使用Spring之后。对象的创建都是由给了Spring框架。
依赖注入:DI——Dependency Injection,是指依赖的对象不需要手动调用setXX方法去设置,而是通过配置赋值。

简单案例

目标: 通过实操person对象理解Spring的自动注入
注: 代码是参考,不是全部实现

private int id;
private String name;
private String phone;
private int age;
<!-- spring ioc配置对象 -->
<bean id="p1" class="top.starrylsi.pojo.Person">

    <!-- 注入属性 -->
    <property name="id" value="1001" />
    <property name="name" value="azrail" />
    <property name="age" value="23" />
    <property name="phone" value="18310720233" />
</bean>
    @Test
    public void testIOC() {
        //1.获取spring容器对象
        ApplicationContext application = new ClassPathXmlApplicationContext("classpath:spring.xml");
//        ApplicationContext application = new FileSystemXmlApplicationContext("config/spring.xml");
        
        
        //2.spring容器获取对象
        Person person = (Person) application.getBean("p1");
        Person person1 = (Person) application.getBean("p1");
        Person person2 = (Person) application.getBean("p1");
        
        //3.显示内容
        System.out.println(person);
        System.out.println(person1);
        System.out.println(person2);
        
        ((ClassPathXmlApplicationContext)application).close();
    }

    
    /*
     * 通过类型寻找bean对象 如果spring容器中含有多个 则报错
     * 只有一个则返回
     * 
     * */

1.1 命名空间p操作参数

注: 需要通过命名空间中勾选 p,然后生成到xml中,才可以使用

<!-- 命名空间p 用于操作参数 -->
    <bean id="p4" class="top.Starrylsi.pojo.Person" p:id="1004" p:name="test03" p:age="18" p:phone="19111112222" />

1.2 Person对象包含Car对象(IOC之子对象的赋值)

分析: 有两种方法可以实现

  1. 内部创建bean
  2. 引用外部bean
    常见错误:内部的Bean不能被外部使用

    public class Car {
    
     private int id;
     private String name;
    
    public class Person {
    
     private int id;
     private String name;
     private String phone;
     private int age;
     private Car car;
     <!-- 先创建一个内部对象 -->
     <bean id="c1" class="com.zhuama.pojo.Car">
         <property name="id" value="10001" />
         <property name="name" value="麦昆" />
     
     </bean>
     <!-- 1.创建一个person对象 包含car对象 -->
     <bean id="p5" class="com.zhuama.pojo.Person">
         <property name="id" value="1005" />
         <property name="name" value="test04" />
         <property name="age" value="23" />
         <property name="phone" value="18312345678" />
         
         <!-- 引用其他的bean 注:内部创建的bean不能被其他bean引用-->
         <property name="car" ref="c1" />
     </bean>
     
     
     <!-- 2.创建一个person对象 包含car对象 -->
     <bean id="p6" class="com.zhuama.pojo.Person">
         <property name="id" value="1006" />
         <property name="name" value="test05" />
         <property name="age" value="23" />
         <property name="phone" value="18312345678" />
         
         <!-- 创建内部bean -->
         <property name="car">
             <bean id="innerCar" class="com.zhuama.pojo.Car">
                 <property name="id" value="10002" />
                 <property name="name" value="马自达" />
             </bean>
         </property>
     </bean>

    1.3 list map properties(了解即可)

private List<Integer> list;

private Map<String,Object> map;

private Properties prop;
<!-- bean中含有集合类型 -->
<bean id="p7" class="com.zhuama.pojo.Person">
    <property name="id" value="1007" />

    <!-- 如果属性是list类型 -->
    <property name="list">
        <list>
            <value>1</value>
            <value>2</value>
            <value>3</value>
        </list>
    </property>
    
    <!-- 如果属性是map类型 -->
    <property name="map">
        <map>
            <entry key="key1" value="value1" />
            <entry key="key2" value="value2" />
            <entry key="key3" value="value3" />
        </map>
    
    </property>
    
    <!-- 如果属性是properties类型 -->
    <property name="prop">
        <props>
            <prop key="driverClassName">com.mysql.driver.Driver</prop>
            <prop key="url">jdbc:mysql://localhost:3306/test</prop>
            <prop key="username">root</prop>
            <prop key="password">123</prop>
        </props>
    </property>
</bean>
    

1.4 IOC之级联属性赋值

<bean id="p13" class="com.zhuama.pojo.Person">
    <property name="name" value="这是12个Person" />
    <!-- 先赋值 -->
    <property name="car" ref="car1"></property>
    <!-- 再级联修改属性 -->
    <property name="car.id" value="2" />
    <property name="car.name" value="级联属性赋值" />
</bean>

1.5 下面是不常用,仅了解即可

IOC之静态工厂方法创建Bean
IOC之工厂实例方法创建Bean
IOC之FactoryBean接口方式创建对象
IOC之继承Bean配置

0

评论 (0)

取消