Spring学习笔记(持续更新...
SpringIOC
-
IOC: Inverse of Control 控制反转
-
将原本在程序中手动创建 UserService 对象的控制权交由 Spring 框架管理。
<!--UserService 的创建权交给了 Spring--> <bean id="userService" class="com.mizhitian.ioc.demo1.UserServiceImpl"> </bean> -
创建 UserService 对象控制权被反转到了 Spring 框架
-
-
DI: Dependency Injection 依赖注入
-
在 Spring 创建这个对象的过程中,将则个对象所依赖的属性注入进去
<!--UserService 的创建权交给了 Spring--> <bean id="userService" class="com.mizhitian.ioc.demo1.UserServiceImpl"> <!-- 设置属性,DI依赖注入 --> <property name="name" value="李四"/> </bean>
-
Spring 工厂类 -- ApplicationContext
- 无论你有没有调用该类的对象,加载配置文件的时候就将配置文件中所有单例模式生成的类实例化
- 实现类
- ClassPathXmlApplicationContex
- 加载类路径下的配置文件
- FileSystemXmlApplicationContext
- 加载文件系统中的配置文件
- ClassPathXmlApplicationContex
- 老版本的工厂类 --- BeanFactory
Spring的Bean管理
-- XML方式
-
三种实例化 Bean 的方式
-
使用类构造器实例化 -- 默认无参
package com.mizhitian.ioc.demo2; public class Bean1 { public Bean1() { System.out.println("Bean1被创建了..."); } }<!--第一种,无参构造器--> <bean id="bean1" class="com.mizhitian.ioc.demo2.Bean1"></bean>测试:
@Test /** * 无参构造器实例化 Bean */ public void demo1() { //加载类路径下的配置文件就,创建 Spring 工厂 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //通过工厂获得类的实例 Bean1 bean1 = (Bean1) applicationContext.getBean("bean1"); } -
使用静态工厂方法实例化 -- 简单工厂模式
package com.mizhitian.ioc.demo2; public class Bean2Factory { public static Bean2 createBean2() { System.out.println("Bean2Factory的方法已经执行了。"); return new Bean2(); } }package com.mizhitian.ioc.demo2; public class Bean2 { }<!--第二种,静态工厂--> <bean id="bean2" class="com.mizhitian.ioc.demo2.Bean2Factory" factory-method="createBean2"></bean>测试:
@Test /** * 静态工厂实例化 Bean */ public void demo2() { // 创建工厂 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Bean2 bean2 = (Bean2) applicationContext.getBean("bean2"); } -
使用实例工厂方法实例化 -- 工厂方法模式
package com.mizhitian.ioc.demo2; //Bean3类的实例工厂 public class Bean3Factory { public Bean3 createBean3() { System.out.println("Bean3Factory执行了..."); return new Bean3(); } }package com.mizhitian.ioc.demo2; public class Bean3 { }<!--第三种,实例工厂,非静态--> <bean id="bean3Factory" class="com.mizhitian.ioc.demo2.Bean3Factory"></bean> <bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3"></bean>测试:
@Test /** * 实例工厂,非静态方法实例化 Bean */ public void demo3() { // 创建工厂 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); // 通过容器获取 id 为 bean3 的实例化对象 Bean3 bean3 = (Bean3) applicationContext.getBean("bean3"); }
-
Spring 容器中 Bean 的配置
-
id 和 name
- 一般情况下,装配一个 Bean 时,通过指定一个 id 属性作为 Bean 的名称
- id 属性在 IOC 容器中必须是唯一的
- name 值可以包含特殊字符
-
Bean 的作用域
-
singleton 单例模式
- 在IOC 容器中仅存在一个 Bean 实例
static String path = "applicationContext.xml"; @Test public void demo1() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext(path); Person person1 = (Person) applicationContext.getBean("person"); Person person2 = (Person) applicationContext.getBean("person"); System.out.println("======默认情况下是单例模式======"); System.out.println(person1); System.out.println(person2); } /* output: ======默认情况下是单例模式====== com.mizhitian.ioc.demo3.Person@612679d6 com.mizhitian.ioc.demo3.Person@612679d6 */显然 person1 和 person2 是同一个对象。
-
prototype
- 每次调用个 getBean() 都会返回一个新的实例
static String path = "applicationContext.xml"; @Test public void demo2() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext(path); Person person1 = (Person) applicationContext.getBean("person2"); Person person2 = (Person) applicationContext.getBean("person2"); System.out.println("====== prototype 多例模式 ======"); System.out.println(person1); System.out.println(person2); } /* output: ====== prototype 多例模式 ====== com.mizhitian.ioc.demo3.Person@612679d6 com.mizhitian.ioc.demo3.Person@11758f2a */显然 person1 和 person2 是两个不同的对象。
-
request
- 每次 HTTP 请求都会创建一个新的 Bean,该作用域仅适用于 WebApplicationContext 环境
-
session
- 同一个 HTTP Session 共享一个 Bean,不同的 HTTP Session 使用不同的 Bean。该作用域仅适用于 WebApplicationContext 环境。
-
钻石要琢磨

浙公网安备 33010602011771号