Spring-IoC-DI

发布时间:2023年12月17日

(SPRING 中文网):https://springdoc.cn/inversion-control-and-dependency-injection-in-spring/
Spring 中的控制反转(IoC)和依赖注入(DI)

  • 控制反转(Inversion of Control)是软件工程中的一项原则,它将对象或程序部分的控制权转移到容器或框架中。
  • 依赖注入是可以用来实现 IoC 的一种模式,其中被反转的控制是设置对象的依赖。
    容器将对象与其他对象 “装配” 起来,或将对象 “注入” 到其他对象中。

依赖

<!--spring-context涵盖了aop,beans,core,expression-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.18</version>
</dependency>
<!--测试工具-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.1</version>
</dependency>

实体类

public class User {
    private String id;
    private String username;
    private String password;
}
public class Student {
    private String[] string;
    private Object object;
    private List<String> list;
    private Map<String,String> map;
    private Properties properties;
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--导入外部配置文件-->
    <import resource="studentBeans.xml"/>
    <!--一个bean代表一个对象,在需要的时候通过反射实例化-->
    <!--name可以起多个别名,用","或";"或" "分隔-->
    <bean id="user1" class="org.example.pojo.User" name="user1-1;user1-2">
        <!--property给对象属性赋值,实际上就是调用set方法,如果没有提供set方法会报错-->
        <property name="id" value="-1"/>
        <property name="password" value="1234"/>
        <property name="username" value="zhangsan"/>
    </bean>
    <!--有参构造创建对象-->
    <bean id="user2" class="org.example.pojo.User">
        <constructor-arg name="id" value=""/>
        <constructor-arg name="password" value=""/>
        <constructor-arg name="username" value=""/>
    </bean>
    <!--给bean配置别名-->
    <alias name="user1" alias="user1-3"/>
    <!--p命名空间注入:setter注入-->
    <!--singleton:单例模式(默认),这个bean只创建一个对象-->
    <!--prototype:原型模式,每次获取这个bean都会产生新对象-->
    <bean id="userP" class="org.example.pojo.User" p:username="zhangsanp" p:password="123p" scope="singleton"/>
    <!--c命名空间注入:构造器注入-->
    <bean id="userC" class="org.example.pojo.User" c:id="1" c:username="zhangsanc" c:password="123c"/>
    <!--不同类型依赖注入-->
    <bean id="user3" class="org.example.pojo.Student">
        <!--对象-->
        <property name="object" ref="user1"/>
        <!--数组,集合-->
        <property name="string">
            <array><!--<list>、<set>-->
                <value>str1</value>
                <value>str2</value>
            </array>
        </property>
        <!--Map-->
        <property name="map">
            <map>
                <entry key="k1" value="v1"/>
                <entry key="k2" value="v2"/>
            </map>
        </property>
        <!--null-->
        <property name="list">
            <null/>
        </property>
        <!--properties-->
        <property name="properties">
            <props>
                <prop key="username">root</prop>
                <prop key="password">1234</prop>
            </props>
        </property>
    </bean>
    <!--spring的自动装配-->
    <!--byName:在容器上下文中查找和类属性名称相同的bean的id-->
    <!--byType:在容器上下文中查找和类属性类型相同的bean的class(与属性类型相同的class必须全局唯一)-->   
    <bean class="org.example.pojo.User" autowire="byName"/>
</beans>

测试类

public class UserTest{
    @Test
    public void getUser(){
        // 传统方式创建对象
        // User user = new User();
        // IOC:由spring框架自动实例化
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("userBeans.xml");
        User userC = (User) beanFactory.getBean("userC");
    }
}
文章来源:https://blog.csdn.net/h_e_l_l_o_______/article/details/134938001
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。