spring——DI

Spring的注入方式

Dependency Injection

概念

  • 依赖注入(Dependency Injection)
  • 依赖:指Bean对象的创建依赖于容器,Bean对象的依赖资源
  • 注入:指Bean对象所依赖的资源,有容器来设置和装配

构造器注入
——————————讲过了= =
Set注入(重点
要求被注入的属性,必须有set方法,set方法的方法名由set+属性首字母大写,如果属性是boolean类型,没有set方法,是is。

测试pojo类:
Address.java

 public class Address {
private String address;
public String getAddress() {

     return address;<br/>
}

public void setAddress(String address) {

     this.address = address;<br/>
}<br/>

}

Student.java

package com.kuang.pojo;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set; public class Student { private String name;

 private Address address;<br/>
 private String[] books;<br/>
 private List&lt;String&gt; hobbys;<br/>
 private Map&lt;String,String&gt; card;<br/>
 private Set&lt;String&gt; games;<br/>
 private String wife;<br/>
 private Properties info;

public void setName(String name) {

     this.name = name;<br/>
}

public void setAddress(Address address) {

     this.address = address;<br/>
}

public void setBooks(String[] books) {

     this.books = books;<br/>
}

public void setHobbys(List&lt;String&gt; hobbys) {

     this.hobbys = hobbys;<br/>
}

public void setCard(Map&lt;String, String&gt; card) {

     this.card = card;<br/>
}

public void setGames(Set&lt;String&gt; games) {

     this.games = games;<br/>
}

public void setWife(String wife) {

     this.wife = wife;<br/>
}

public void setInfo(Properties info) {

     this.info = info;<br/>
}

public void show(){

     System.out.println(&#34;name=&#34;+ name<br/>
             + &#34;,address=&#34;+ address.getAddress()<br/>
             + &#34;,books=&#34;<br/>
    );<br/>
     for (String book:books){<br/>
         System.out.print(&#34;&lt;&lt;&#34;+book+&#34;&gt;&gt;\t&#34;);<br/>
    }<br/>
     System.out.println(&#34;\n爱好:&#34;+hobbys);

System.out.println(“card:”+card); System.out.println(“games:”+games); System.out.println(“wife:”+wife); System.out.println(“info:”+info); }
}

1、常量注入

&lt;bean id=“student” class=“com.pp.pojo.Student”&gt;

&lt;property name=&#34;name&#34; value=&#34;盼盼&#34;<br/>

&lt;/bean&gt;

测试:

 @Test
public void test01(){

 ApplicationContext context = new ClassPathXmlApplicationContext(&#34;applicationContext.xml&#34;);

Student student = (Student) context.getBean(“student”); System.out.println(student.getName()); }

2、Bean注入
注意点:这里的值是一个引用,ref

 &lt;bean id=“addr” class=“com.kuang.pojo.Address”&gt;

 &lt;property name=&#34;address&#34; value=&#34;宿迁&#34;/&gt;<br/>

&lt;/bean&gt; &lt;bean id=“student” class=“com.kuang.pojo.Student”&gt;

 &lt;property name=&#34;name&#34; value=&#34;小明&#34;/&gt;<br/>
 &lt;property name=&#34;address&#34; ref=&#34;addr&#34;/&gt;<br/>

&lt;/bean&gt;

3、数组注入

 &lt;bean id=“student” class=“com.kuang.pojo.Student”&gt;

 &lt;property name=&#34;name&#34; value=&#34;小明&#34;/&gt;<br/>
 &lt;property name=&#34;address&#34; ref=&#34;addr&#34;/&gt;<br/>
 &lt;property name=&#34;books&#34;&gt;<br/>
     &lt;array&gt;<br/>
         &lt;value&gt;西游记&lt;/value&gt;<br/>
         &lt;value&gt;红楼梦&lt;/value&gt;<br/>
         &lt;value&gt;水浒传&lt;/value&gt;<br/>
     &lt;/array&gt;<br/>
 &lt;/property&gt;<br/>

&lt;/bean&gt;

4、List注入

 &lt;property name=“hobbys”&gt;

 &lt;list&gt;<br/>
     &lt;value&gt;听歌&lt;/value&gt;<br/>
     &lt;value&gt;看电影&lt;/value&gt;<br/>
     &lt;value&gt;爬山&lt;/value&gt;<br/>
 &lt;/list&gt;<br/>

&lt;/property&gt;

5、Map注入

&lt;property name=“card”&gt;

 &lt;map&gt;<br/>
     &lt;entry key=&#34;中国邮政&#34; value=&#34;456456456465456&#34;/&gt;<br/>
     &lt;entry key=&#34;建设&#34; value=&#34;1456682255511&#34;/&gt;<br/>
 &lt;/map&gt;<br/>

&lt;/property&gt;

6、set注入

 &lt;property name=“games”&gt;

 &lt;set&gt;<br/>
     &lt;value&gt;LOL&lt;/value&gt;<br/>
     &lt;value&gt;BOB&lt;/value&gt;<br/>
     &lt;value&gt;COC&lt;/value&gt;<br/>
 &lt;/set&gt;<br/>

&lt;/property&gt;

7、NULL注入

&lt;property name=“wife”&gt;

&lt;null/&gt;<br/>

&lt;/property&gt;

8、Preperties注入

&lt;property name=“info”&gt;

 &lt;props&gt;<br/>
     &lt;prop key=&#34;学号&#34;&gt;20190604&lt;/prop&gt;<br/>
     &lt;prop key=&#34;性别&#34;&gt;男&lt;/prop&gt;<br/>
     &lt;prop key=&#34;姓名&#34;&gt;小明&lt;/prop&gt;<br/>
 &lt;/props&gt;<br/>

&lt;/property&gt;

p命名和c命名注入

User.java:[注意:这里没有有参构造器]

public class User {

 private String name;<br/>
 private int age;

public void setName(String name) {

     this.name = name;<br/>
}

public void setAge(int age) {

     this.age = age;<br/>
}

@Override

 public String toString() {<br/>
     return &#34;User{&#34; +<br/>
             &#34;name=&#39;&#34; + name + &#39;\&#39;&#39; +<br/>
             &#34;, age=&#34; + age +<br/>
             &#39;}&#39;;<br/>
}<br/>

}

1、P命名空间注入 : 需要在头文件中加入约束文件

导入约束 : xmlns:p=“http://www.springframework.org/schema/p&#34;
&lt;!–P(属性: properties)命名空间 , 属性依然要设置set方法–&gt;
&lt;bean id=”user“ class=”com.kuang.pojo.User“ p:name=”panpan“ p:age=”18“/&gt;

2、c 命名空间注入 : 需要在头文件中加入约束文件

导入约束 : xmlns:c=”http://www.springframework.org/schema/c&#34;
&lt;!–C(构造: Constructor)命名空间 , 属性依然要设置set方法–&gt;
&lt;bean id=“user” class=“com.kuang.pojo.User” c:name=“panpan” c:age=“18”/&gt;

解决:把有参构造器加上,这里也能知道,c 就是所谓的构造器注入!

测试代码:

 @Test
public void test02(){

 ApplicationContext context = new ClassPathXmlApplicationContext(&#34;applicationContext.xml&#34;);<br/>
 User user = (User) context.getBean(&#34;user&#34;);<br/>
 System.out.println(user);<br/>

}

Bean的作用域
在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象 .

几种作用域中,request、session作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。

Singleton

当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置:

 &lt;bean id=“ServiceImpl” class=“cn.csdn.service.ServiceImpl” scope=“singleton”&gt;

测试:

 @Test
public void test03(){

 ApplicationContext context = new ClassPathXmlApplicationContext(&#34;applicationContext.xml&#34;);<br/>
 User user = (User) context.getBean(&#34;user&#34;);<br/>
 User user2 = (User) context.getBean(&#34;user&#34;);<br/>
 System.out.println(user==user2);<br/>

}

Prototype

当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype,可以这样配置:

 &lt;bean id=“account” class=“com.foo.DefaultAccount” scope=“prototype”/&gt;
或者
&lt;bean id=“account” class=“com.foo.DefaultAccount” singleton=“false”/&gt;

Request

当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

 &lt;bean id=“loginAction” class=cn.csdn.LoginAction“ scope=”request“/&gt;

针对每次HTTP请求,Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。

Session

当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

 &lt;bean id=”userPreferences“ class=”com.foo.UserPreferences“ scope=”session“/&gt;

针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。