依赖注入(DI) Dependency Injection
概念
-
依赖注入(Dependency Injection,DI)。
-
依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 .
-
注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 .
构造器注入
我们在之前的案例已经讲过了
Set 注入 (重点)
要求被注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is .
测试pojo类 :
Address.java
public class Address {private String address;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}}
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;private String[] books;private List hobbys;private Map card;private Set games;private String wife;private Properties info;public void setName(String name) {this.name &#61; name;}public void setAddress(Address address) {this.address &#61; address;}public void setBooks(String[] books) {this.books &#61; books;}public void setHobbys(List hobbys) {this.hobbys &#61; hobbys;}public void setCard(Map card) {this.card &#61; card;}public void setGames(Set games) {this.games &#61; games;}public void setWife(String wife) {this.wife &#61; wife;}public void setInfo(Properties info) {this.info &#61; info;}public void show(){System.out.println("name&#61;"&#43; name&#43; ",address&#61;"&#43; address.getAddress()&#43; ",books&#61;");for (String book:books){System.out.print("<<"&#43;book&#43;">>\t");}System.out.println("\n爱好:"&#43;hobbys);System.out.println("card:"&#43;card);System.out.println("games:"&#43;games);System.out.println("wife:"&#43;wife);System.out.println("info:"&#43;info);}}
1、常量注入
测试&#xff1a;
&#64;Testpublic void test01(){ApplicationContext context &#61; new ClassPathXmlApplicationContext("applicationContext.xml");Student student &#61; (Student) context.getBean("student");System.out.println(student.getName());}
2、Bean注入
注意点&#xff1a;这里的值是一个引用&#xff0c;ref
3、数组注入
西游记红楼梦水浒传
4、List注入
听歌看电影爬山
5、Map注入
6、set注入
LOLBOBCOC
7、Null注入
8、Properties注入
20190604男小明
测试结果&#xff1a;
p命名和c命名注入
User.java &#xff1a;【注意&#xff1a;这里没有有参构造器&#xff01;】
public class User {private String name;private int age;public void setName(String name) {this.name &#61; name;}public void setAge(int age) {this.age &#61; age;}&#64;Overridepublic String toString() {return "User{" &#43;"name&#61;&#39;" &#43; name &#43; &#39;\&#39;&#39; &#43;", age&#61;" &#43; age &#43;&#39;}&#39;;}}
1、P命名空间注入 : 需要在头文件中加入约束文件
导入约束 : xmlns:p&#61;"http://www.springframework.org/schema/p"
2、c 命名空间注入 : 需要在头文件中加入约束文件
导入约束 : xmlns:c&#61;"http://www.springframework.org/schema/c"
发现问题&#xff1a;爆红了&#xff0c;刚才我们没有写有参构造&#xff01;
解决&#xff1a;把有参构造器加上&#xff0c;这里也能知道&#xff0c;c 就是所谓的构造器注入&#xff01;
测试代码&#xff1a;
&#64;Testpublic void test02(){ApplicationContext context &#61; new ClassPathXmlApplicationContext("applicationContext.xml");User user &#61; (User) context.getBean("user");System.out.println(user);}
Bean的作用域
在Spring中&#xff0c;那些组成应用程序的主体及由Spring IoC容器所管理的对象&#xff0c;被称之为bean。简单地讲&#xff0c;bean就是由IoC容器初始化、装配及管理的对象 .
几种作用域中&#xff0c;request、session作用域仅在基于web的应用中使用&#xff08;不必关心你所采用的是什么web应用框架&#xff09;&#xff0c;只能用在基于web的Spring ApplicationContext环境。
Singleton&#xff08;默认随机&#xff0c;单例模式&#xff09;
当一个bean的作用域为Singleton&#xff0c;那么Spring IoC容器中只会存在一个共享的bean实例&#xff0c;并且所有对bean的请求&#xff0c;只要id与该bean定义相匹配&#xff0c;则只会返回bean的同一实例。Singleton是单例类型&#xff0c;就是在创建起容器时就同时自动创建了一个bean的对象&#xff0c;不管你是否使用&#xff0c;他都存在了&#xff0c;每次获取到的对象都是同一个对象。注意&#xff0c;Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton&#xff0c;可以这样配置&#xff1a;
测试&#xff1a;
&#64;Testpublic void test03(){ApplicationContext context &#61; new ClassPathXmlApplicationContext("applicationContext.xml");User user &#61; (User) context.getBean("user");User user2 &#61; (User) context.getBean("user");System.out.println(user&#61;&#61;user2);}
Prototype 原型模式 每次从容器中get的时候&#xff0c;都会产生一个新对象。
当一个bean的作用域为Prototype&#xff0c;表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求&#xff08;将其注入到另一个bean中&#xff0c;或者以程序的方式调用容器的getBean()方法&#xff09;时都会创建一个新的bean实例。Prototype是原型类型&#xff0c;它在我们创建容器的时候并没有实例化&#xff0c;而是当我们获取bean的时候才会去创建一个对象&#xff0c;而且我们每次获取到的对象都不是同一个对象。根据经验&#xff0c;对有状态的bean应该使用prototype作用域&#xff0c;而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype&#xff0c;可以这样配置&#xff1a;
或者
Request
当一个bean的作用域为Request&#xff0c;表示在一次HTTP请求中&#xff0c;一个bean定义对应一个实例&#xff1b;即每个HTTP请求都会有各自的bean实例&#xff0c;它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义&#xff1a;
针对每次HTTP请求&#xff0c;Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例&#xff0c;且该loginAction bean实例仅在当前HTTP request内有效&#xff0c;因此可以根据需要放心的更改所建实例的内部状态&#xff0c;而其他请求中根据loginAction bean定义创建的实例&#xff0c;将不会看到这些特定于某个请求的状态变化。当处理请求结束&#xff0c;request作用域的bean实例将被销毁。
Session
当一个bean的作用域为Session&#xff0c;表示在一个HTTP Session中&#xff0c;一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义&#xff1a;
针对某个HTTP Session&#xff0c;Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例&#xff0c;且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样&#xff0c;可以根据需要放心的更改所创建实例的内部状态&#xff0c;而别的HTTP Session中根据userPreferences创建的实例&#xff0c;将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候&#xff0c;在该HTTP Session作用域内的bean也会被废弃掉。