在Spring中依赖注入的几种方式实现松耦合

一、普通注入方式:

(1)在IDEA工作空间内先创建lib包然后导入Spring的架包(复制进去的架包要按住鼠标右键出现Add as Library)。

(2)在已经创建好架包的基础上在src目录下创建XML文件,文件命为applicationContext.xml,需要注意的是我们创建的是Spring Config的xml格式,假如说你导入的架包没有Add as Library的话是不会出现Spring Config的选项的。

(3)创建好xml文件后在文件中编写:

<bean class="com.lgq.Spring01.User" id="user1"/>

(注意:在里面写的是User我们先前设置好的JavaBean,并给出一个ID或者name【ID和nam的区别:ID的分号内表示bean只有一个名字,name里面有多个bean的名字,他们使用逗号分开】);

(4)创建好我们的xml文件后在src目录下创建我们的文件包(cn.sxt.Spring01);然后创建Class文件命为User;创建我们的JAVABEAN,并创建set/get以及无参构造方法。在无参构造方法中输出一句表示该Bean注入了Spring容器中。

    public class User {
    private Integer id;
    private String name;
    private String address;
    public void sayHello(String name) {
        System.out.println("name->"+ name);
    }

(5)创建在Src目录下创建一个Class命名为Main。在Main下创建ClassPathXmlAppliccationContext类,并把创建好的xml文件路径给到它。

    public class Main {

    public static void main(String[] args) {
        //初始化Spring容器,当Spring容器初始化时,会自动加载配置文件,然后根据配置文件中的内容初始化Bean
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //去Spring容器中,获取一个对象
        User user1 = (User) ctx.getBean("user1");
        user1.sayHello("张三");
    }

二、静态工厂注入方式

(1)静态工厂模式实现的方式,先定义一个静态工厂的方法;

public class UserFactory {

public static User getInstance() {

return new User();

}

}

(注意:这里返回的是User这个bean,在这里new一个User())

(2)在xml中配置,配置时是通过静态工厂模式拿到JavaBean里面的字段,

  1. <bean class="com.lgq.Spring01.UserFactory" factory-method="getInstance" id="user2"/>

(3)测试输出

@Test

public void test3() {

User user2 = (User) ctx.getBean("user2");

user2.sayHello("zhaoliu");

}

三、实例工厂模式

(1)实例工厂注入与静态工厂注入基本一致,主要区别体现在工厂方法是不是静态方法工厂方法示例,创建实例工厂:

public class UserFactory2 {

public User getInstance() {

return new User();

}

}

(2)配置示例,配置与静态工厂的区别在于工厂模式要经过factory-bean而获取到里面的方法。而后实现控制反转。

<bean class="com.lgq.Spring01.UserFactory2" id="userFactory2"/>

<bean class="com.lgq.Spring01.User" factory-bean="userFactory2" factory-method="getInstance" id="user3"/>

四、属性注入

(1)构造方法注入

  • 创建一个JavaBean命名为Book;并创建get/set、有参构造、重写toString等方法
public class Book {   
     private Integer id; 
     private String name;
     private String author;
}
  • 在xml中配置,可以通过nama赋值也可以通过index下标方式赋值
name赋值方式:
<bean class="com.itbaizhan.Book" id="book1">
    <constructor-arg name="id" value="1"/>
    <constructor-arg name="name" value="三国演义"/>
    <constructor-arg name="author" value="罗贯中"/>
</bean>

index下标赋值方式:
<bean class="com.itbaizhan.Book" id="book2">
    <constructor-arg index="0" value="2"/>
    <constructor-arg index="1" value="红楼梦"/>
    <constructor-arg index="2" value="曹雪芹"/>
</bean>
  • 测试:
    @Test
    public void test1() {
        Book book1 = (Book) ctx.getBean("book1");
        System.out.println(book1);
    }
    @Test
    public void test2() {
        Book book2 = (Book) ctx.getBean("book2");
        System.out.println(book2);
    }
  • 对象注入三种不同的配置方式;
p注入方式:ref拿到对象的属性
<bean class="com.itbaizhan.User" id="user2">
<constructor-arg name="name" value="里斯"/>
<constructor-arg name="id" value="2"/>
<constructor-arg name="address" value="广州"/>
<constructor-arg name="cat" ref="cat1"/>
</bean>
<bean class="com.itbaizhan.User" id="user3" p:id="3" p:cat-ref="cat1" p:name="王五"/>    <bean class="com.itbaizhan.User" id="user1">


<property name="name" value="张三"/>
<property name="id" value="1"/>
<property name="address" value="深圳"/>
<property name="cat" ref="cat1"/>
</bean>
<bean class="com.itbaizhan.Cat" id="cat1">
<property name="id" value="1"/>
<property name="name" value="小白"/>
<property name="color" value="白色"/>
</bean>

五、数组合集合的注入方式

1、数组和集合的注入方式是一致的,无论是基本数据类型还是一个引用,注入方式都是一样。

首先声明一个对象,对象中包含集合和数组:

public class User {
    private Integer id;
    private String name;
    private String address;
    private Cat cat;
    private List<String> favorites;
    private Book[] books;
}

2、然后在xml文件中进行配置,五路是通过构造方法注入,还是通过set方法注入,都是使用list节点进行注入

<bean class="com.itbaizhan.User" id="user4">        <property name="address" value="广州"/>        <property name="id" value="4"/>        <property name="name" value="王五"/>        <property name="favorites">            <list>                <value>足球</value>                <value>篮球</value>            </list>        </property>        <property name="books">            <list>                <bean class="com.itbaizhan.Book">                    <property name="name" value="三国演义"/>                    <property name="id" value="1"/>                </bean>                <bean class="com.itbaizhan.Book">                    <property name="id" value="2"/>                    <property name="name" value="红楼梦"/>                </bean>            </list>        </property>    </bean>    <bean class="com.itbaizhan.Book" id="book1">        <property name="name" value="三国演义"/>        <property name="id" value="1"/>    </bean>    <bean class="com.itbaizhan.Book" id="book2">        <property name="id" value="2"/>        <property name="name" value="红楼梦"/>    </bean>    <bean class="com.itbaizhan.User" id="user5">        <property name="address" value="广州"/>        <property name="id" value="4"/>        <property name="name" value="王五"/>        <property name="favorites">            <list>                <value>足球</value>                <value>篮球</value>            </list>        </property>        <property name="books">            <list>               <ref bean="book1"></ref>               <ref bean="book2"></ref>            </list>        </property>    </bean>

 

六、集合方式注入

 

1、声明Map属性,注意属性的key和value的数据类型需要提前定义好,然后在xml文件中直接使用(xml文件中配置时,key和属性的值必须要满足声明的要求,否则就会出错)。声明方式如下:

private Map<String, Object> info;

 2、xml配置

<bean class="com.itbaizhan.User" id="user5">        <property name="address" value="广州"/>        <property name="id" value="4"/>        <property name="name" value="王五"/>        <property name="favorites">            <list>                <value>足球</value>                <value>篮球</value>            </list>        </property>        <property name="books">            <list>               <ref bean="book1"></ref>               <ref bean="book2"></ref>            </list>        </property>        <property name="info">            <map>                <entry key="age" value="99"/>                <entry key="cat" value-ref="cat1"/>            </map>        </property>    </bean>

猜你喜欢

转载自blog.csdn.net/qq_38037950/article/details/83783028