Spring(二)IOC
2017-10-25 16:57
190 查看
转载请注明出处:http://blog.csdn.net/github_39430101/article/details/78343491
*IOC控制反转的作用就是管理组件对象,维护对象关系。*
然后我们需要实例化Spring容器,将生产好的对象取出来
原理:解析spring的配置文件,利用Java的反射机制创建对象。
创建电脑类
创建applicationContext.xml
编写测试类
静态工厂
增加一个电脑工厂类
修改applicationContext.xml
实例工厂
创建非静态工厂类
修改applicationContext.xml
在applicationContext.xml bean属性中增加scope=”prototype”,执行测试类得到false。
默认情况下Spring容器创建时,会创建单例的对象,也可以让Spring容器延迟实例化这些单例的对象
Spring容器给属性注入值
在applicationContext.xml中声明这个bean
测试
运行结果
applicationContext.xml
测试
运行结果:
DI依赖注入的值有很多类型,包括对象注入、List、Set、表达式注入等。
例如集合注入
组件自动扫描
可以按照指定的包路径,将包下所有组件扫描,如果发现组件类定义前有以下标记,会将组件扫描到Spring容器。
@Component //其他组件
@Controller //控制器组件
@Service //业务层组件
@Repository //数据访问层组件
@Named(需要引入第三方标准包)
示例:
创建一个ExampleBean,且添加注解
创建applicationContext.xml,开启注解
编写测试类
运行结果:
对象注入
@Resource(name=”指定名称”)
@Autowired
直接在属性上面编写即可,不再赘述。
*IOC控制反转的作用就是管理组件对象,维护对象关系。*
管理组件对象
传统获取对象
public class A{ public void createObject(){ //通过new来创建对象,是主动的创建 C c = new C(); } }
Spring容器创建对象
创建xml文件,把想要的对象的”注册信息”写好,然后让Spring容器生产<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- class包名+类名--> <bean id="c" class="com.spring.bean.C"></bean> </bean>
然后我们需要实例化Spring容器,将生产好的对象取出来
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); C c = ac.getBean("c",C.class);
原理:解析spring的配置文件,利用Java的反射机制创建对象。
Spring创建对象的方式有三种
通过构造方法创建电脑类
public class Computer{ private String cpu; public void show(){ System.out.println("我是I7处理器"); } }
创建applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="c" class="com.spring.bean.Computer"></bean> </beans>
编写测试类
public class TestBean { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); Computer mac = ac.getBean("c",Computer.class); mac.show(); } }
静态工厂
增加一个电脑工厂类
public class ComputerStaticFactory{ public static Computer getInstance(){ return new Computer(); } }
修改applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="c" class="com.spring.bean.ComputerStaticFactory" factory-method="getInstance"></bean></beans>
实例工厂
创建非静态工厂类
public class ComputerFactory{ public Computer getInstance(){ return new Computer(); } }
修改applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="ComputerFactory" class="com.spring.bean.ComputerFactory"/> <bean id="c" factory-bean="ComputerFactory" factory-method="getInstance"></bean> </beans>
bean的作用域
默认是单例模式,测试bean是否是单例public class TestBean { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); Computer mac = ac.getBean("c",Computer.class); Computer windows = ac.getBean("c",Computer.class); System.out.println(windows == mac); } } //输出结果为true
在applicationContext.xml bean属性中增加scope=”prototype”,执行测试类得到false。
bean的生命周期
Spring容器在创建bean时,可以帮忙管理bean的生命周期,即管理bean的初始化及销毁的方法。默认情况下Spring容器创建时,会创建单例的对象,也可以让Spring容器延迟实例化这些单例的对象
维护对象关系(DI)
传统的方法给属性赋值package com.spring.bean; public class Computer { private String cpu;//cpu private String hdd;//硬盘 private String ram;//内存 public String getCpu() { return cpu; } public void setCpu(String cpu) { this.cpu = cpu; } public String getHdd() { return hdd; } public void setHdd(String hdd) { this.hdd = hdd; } public String getRam() { return ram; } public void setRam(String ram) { this.ram = ram; } public void show() { System.out.println("cpu型号是"+cpu); System.out.println("hdd型号是"+hdd); System.out.println("ram型号是"+ram); } }
package com.spring.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.spring.bean.Computer; import com.spring.bean.ExampleBean; public class TestBean { public static void main(String[] args) { Computer c = new Computer(); c.setCpu = "i7"; c.setRam = "金士顿"; c.setHdd = "三星"; } }
Spring容器给属性注入值
setter注入
创建电脑类Computer,代码如下:package com.spring.bean; public class Computer { private String cpu;//cpu private String hdd;//硬盘 private String ram;//内存 public String getCpu() { return cpu; } public void setCpu(String cpu) { this.cpu = cpu; } public String getHdd() { return hdd; } public void setHdd(String hdd) { this.hdd = hdd; } public String getRam() { return ram; } public void setRam(String ram) { this.ram = ram; } public void show() { System.out.println("cpu型号是"+cpu); System.out.println("hdd型号是"+hdd); System.out.println("ram型号是"+ram); } }
在applicationContext.xml中声明这个bean
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="computer" class="com.spring.bean.Computer"> <property name="cpu" value="i7"></property> <property name="hdd" value="三星"></property> <property name="ram" value="金士顿"></property> </bean> </beans>
测试
package com.spring.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.spring.bean.Computer; import com.spring.bean.ExampleBean; public class TestBean { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); Computer c = ac.getBean("computer",Computer.class); c.show(); } }
运行结果
构造器注入
创建手机类package com.spring.bean; public class Phone { private String color; private int price; public Phone(String color,int price) { this.color = color; this.price = price; } public void show() { System.out.println("手机颜色是:"+color); System. d8d2 out.println("手机价格是:"+price); } }
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="phone" class="com.spring.bean.Phone"> <constructor-arg index="0" value="红色"></constructor-arg> <constructor-arg index="1" value="2300"></constructor-arg> </bean> </beans>
测试
package com.spring.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.spring.bean.Computer; import com.spring.bean.ExampleBean; import com.spring.bean.Phone; public class TestBean { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); Phone p = ac.getBean("phone",Phone.class); p.show(); } }
运行结果:
DI依赖注入的值有很多类型,包括对象注入、List、Set、表达式注入等。
例如集合注入
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="phone" class="com.spring.bean.Phone"> <!-- 构造器注入 --> <constructor-arg index="0" value="红色"></constructor-arg> <!-- list注入 --> <property name="style"> <list> <value>iphone</value> <value>华为</value> </list> </property> <!-- 对象注入 --> <property name="style" ref="computer"></property> </bean> </beans>
spring注解
上面我们是通过xml配置来实现IOC的,接下来我们使用注解来是现实。组件自动扫描
可以按照指定的包路径,将包下所有组件扫描,如果发现组件类定义前有以下标记,会将组件扫描到Spring容器。
@Component //其他组件
@Controller //控制器组件
@Service //业务层组件
@Repository //数据访问层组件
@Named(需要引入第三方标准包)
示例:
创建一个ExampleBean,且添加注解
package com.spring.bean; import org.springframework.stereotype.Component; //扫描ExampleBean组件,也可以指定id @Component("exampleBean") @Component @Scope("prototype") public class ExampleBean { public void execute() { System.out.println("执行execute方法"); } }
创建applicationContext.xml,开启注解
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 开启组件扫描 --> <context:component-scan base-package="com.spring"></context:component-scan> </beans>
编写测试类
package com.spring.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.spring.bean.Computer; import com.spring.bean.ExampleBean; import com.spring.bean.Phone; public class TestBean { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); ExampleBean eb = ac.getBean("exampleBean",ExampleBean.class); eb.execute(); } }
运行结果:
对象注入
@Resource(name=”指定名称”)
@Autowired
直接在属性上面编写即可,不再赘述。
相关文章推荐
- Spring IOC AOP详解(一)
- Spring源码解读-Spring IoC容器初始化之资源解析
- spring 8 bean配置--IOC容器中bean的生命周期
- 深入探索spring技术内幕(三): 剖析spring IoC工作原理和配置依赖注入
- 【spring源码分析】BeanDefinitionRegistryPostProcessor接口可自定义bean加入IOC
- Spring之IOC,DI,动态代理,反射
- 关于Spring IOC (DI-依赖注入)你需要知道的一切
- Spring源码阅读 四 IOC
- 基于springioc bean 的几个属性介绍
- Java - 在Web项目中如何获得Spring的IoC容器?
- spring学习笔记 -- day03 IOC中的bean标签、DI依赖注入
- Spring学习-------IOC
- Ioc容器BeanPostProcessor-Spring 源码(3)
- Spring中三个重要概念 IOC AOP Bean
- Spring的IOC原理
- 关于spring的两个概念:IoC(控制反转) ,DI(依赖注入)
- 谈谈对Spring IOC的理解
- 【Spring学习】之 IOC
- Spring的IoC介绍
- Spring---IOC(控制反转+依赖注入)