spring2.5IOC控制反转详解
基本的代码结构
1 IOC包下
基本的spring创建对象
将类添加到配置文件中,由容器创建。
Source code |
- <?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-2.5.xsd">
- <!--
- 把HelloWorld这个类纳入spring容器
- id为bean的唯一标识
- 正规的写法:
- 类的第一个字母变成小写,其余不变
- class为类的全名
- -->
- <bean id="helloWorld" class="cn.itcast.spring0401.ioc.HelloWorld"></bean>
- </beans>
helloworld类
Source code |
- package cn.itcast.spring0401.ioc;
- public class HelloWorld {
- public void say(){
- System.out.println("hello");
- }
- }
测试类
这就是控制反转
Source code |
- package cn.itcast.spring0401.ioc;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- /**
- * 控制反转
- * @author Administrator
- *
- */
- public class IOCTest {
- /**
- * 启动spring容器
- * 创建spring容器对象就相当于启动spring容器
- * spring容器做的工作:
- * * 创建对象
- */
- @Test
- public void testHelloWorld(){
- ApplicationContext context = new ClassPathXmlApplicationContext("cn/itcast/spring0401/ioc/applicationContext.xml");
- HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
- helloWorld.say();
- }
- }
2 alias包,别名
配置文件,可以给类起别名
Source code |
- <?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-2.5.xsd">
- <bean id="helloWorld" class="cn.itcast.spring0401.alias.HelloWorld"></bean>
- <!--
- name与bean中的id对应
- alias 名字
- -->
- <alias alias="狗蛋" name="helloWorld"/>
- <alias alias="王三麻子" name="helloWorld"/>
- </beans>
测试方法
Source code |
- package cn.itcast.spring0401.alias;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class AliasTest {
- @Test
- public void test(){
- ApplicationContext context = new ClassPathXmlApplicationContext("cn/itcast/spring0401/alias/applicationContext.xml");
- HelloWorld helloWorld = (HelloWorld)context.getBean("王三麻子");
- helloWorld.say();
- }
- }
输出结果还是一样的。
3 createbean 创建对象的几种方法
* 利用默认的构造函数
* 利用静态工厂方法
* 利用实例工厂方法
配置文件
Source code |
- <?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-2.5.xsd">
- <bean id="helloWorld" class="cn.itcast.spring0401.createbean.HelloWorld"></bean>
- <!--
- -->
- <bean id="helloWorld1" class="cn.itcast.spring0401.createbean.HelloWorldFactory" factory-method="createBean"></bean>
- </beans>
工厂类
Source code |
- package cn.itcast.spring0401.createbean;
- public class HelloWorldFactory {
- /**
- * 工厂方法
- * @return
- */
- public static HelloWorld createBean(){
- return new HelloWorld();
- }
- }
helloworld
Source code |
- package cn.itcast.spring0401.createbean;
- public class HelloWorld {
- public void say(){
- System.out.println("hello");
- }
- public HelloWorld(){
- System.out.println("new helloworld");
- }
- }
测试类
Source code |
- package cn.itcast.spring0401.createbean;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class CreateBeanTest {
- /**
- * 在HelloWorld中写如下代码
- * public HelloWorld(){
- System.out.println("new helloworld");
- }
- 输出为:"new helloworld"
- 说明
- * spring容器默认调用类的默认的构造器来创建对象的
- * 如果在HelloWorld中,没有默认的构造器,则spring在创建helloWorld对象时,会报错
- 因为找不到默认的构造器
- */
- @Test
- public void testConstructor(){
- ApplicationContext context = new ClassPathXmlApplicationContext("cn/itcast/spring0401/createbean/applicationContext.xml");
- HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
- helloWorld.say();
- }
- /**
- * spring容器做的事情:
- * * spring容器调用了工厂类的工厂方法
- * * 真正创建对象new HelloWorld()是由程序员来完成的
- */
- @Test
- public void testFactory(){
- ApplicationContext context = new ClassPathXmlApplicationContext("cn/itcast/spring0401/createbean/applicationContext.xml");
- HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld1");
- helloWorld.say();
- }
- }
4init包,创建对象的时机
默认情况下,在spring启动的时候,创建纳入spring容器中所有的bean
在spring容器启动的时候,可以检查错误
但是如果bean的属性中有数据,会过早的加载到内存中,所以如果bean中有数据
应该把数据的对象的声明放在方法中
* 如果在spring的配置文件中,有lazy-init为true,则context.getBean(“beanId”)时
才要创建对象
缺点:在spring容器启动的时候,是检验不出错误的
配置文件
Source code |
- <?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-2.5.xsd">
- <bean id="helloWorld" class="cn.itcast.spring0401.init.HelloWorl" lazy-init="true"></bean>
- </beans>
helloworld
Source code |
- package cn.itcast.spring0401.init;
- import java.util.ArrayList;
- import java.util.List;
- public class HelloWorld {
- public List<String> sList = new ArrayList<String>();
- public void say(){
- System.out.println("hello");
- }
- public HelloWorld(){
- System.out.println("aaa");
- }
- }
测试
Source code |
- package cn.itcast.spring0401.init;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class InitTest {
- /**
- * * 在默认情况下,spring容器启动的时候,就把所有的纳入spring容器的bean创建对象
- * 缺点:
- * 如果一个对象中有属性,比如这个属性为集合,在创建这个对象的过程中,集合中有数据
- * 这样采用默认的启动形式,就会导致数据过早的加载到内存中
- * * 可以在spring的配置文件中:
- * <bean id="helloWorld" class=".." lazy-init="true">
- * 延迟bean的创建时间,在context.getBean时才要创建bean的对象
- * 如果spring的配置文件书写错误,如果所有的spring的bean都采用lazy-init="true"这种形式
- 则在启动web服务器的时候,发现不了spring容器的错误,这样是不利于排错的
- */
- @Test
- public void test(){
- ApplicationContext context = new ClassPathXmlApplicationContext("cn/itcast/spring0401/init/applicationContext.xml");
- HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
- helloWorld.say();
- }
- }
5scope 对象作用范围,单例多里
在配置文件中,scope为
“singleton”
* 默认值
* spring产生的bean只有一个实例
* 处于单例模式的bean的创建、初始化、销毁都是受spring容器管理的
* 在容器关闭的时候执行销毁工作
“prototype”
* 多例
* spring容器负责该bean的创建、初始化,但是销毁工作程序员做
* 无论该bean的lazy-init为什么值,都在context.getBean时创建对象
* 如果该bean中有资源对象,手动关闭
配置
Source code |
- <?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-2.5.xsd">
- <!--
- scope
- 决定bean的范围
- singleton 单例 默认
- prototype 原型 多例
- -->
- <bean id="helloWorld" class="cn.itcast.spring0401.scope.HelloWorld" scope="singleton"></bean>
- </beans>
测试
Source code |
- package cn.itcast.spring0401.scope;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class ScopeTest {
- /**
- * 由spring容器产生的bean默认是单例模式
- * 在spring的配置文件中:
- * scope:
- * singleton 默认的形式
- * 如果写默认的形式,一个集合或者一个数据出现在了类的属性中,这个数据将成为全局的数据(共享数据),应该
- * 注意并发问题
- * 当spring容器中的bean是多例,则不管配置文件中的lazy-init为default、false还是true,在
- * context.getBean时才要为bean创建对象
- */
- @Test
- public void test(){
- ApplicationContext context = new ClassPathXmlApplicationContext("cn/itcast/spring0401/scope/applicationContext.xml");
- HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
- helloWorld.s.add("aaa");
- helloWorld.s.add("bb");
- HelloWorld helloWorld1 = (HelloWorld)context.getBean("helloWorld");
- helloWorld1.s.add("cc");
- System.out.println(helloWorld.s.size());
- }
- }
6initdestory
对象的初始化,销毁
配置文件
Source code |
- <?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-2.5.xsd">
- <!--
- init-method
- 对象的初始化方法
- destroy-method
- 对象的销毁方法
- -->
- <bean id="helloWorld" class="cn.itcast.spring0401.initdestroy.HelloWorld" init-method="init" destroy-method="destroy" scope="prototype"></bean>
- </beans>
测试
Source code |
- package cn.itcast.spring0401.initdestroy;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class InitDestroyTest {
- /**
- * 在spring的配置文件中
- * init-method="init"
- * 说明在创建完该对象后,立刻执行init方法,用来进行初始化
- * destroy-method="destroy"
- * * 当该bean为单例模式,才能调用该方法
- * destroy方法在容器销毁的时候被调用
- * * 当该bean为多例时,spring容器不负责他的销毁工作
- * * 如果该bean为多例时,当不用该bean时,应该手动销毁资源文件
- */
- @Test
- public void test(){
- ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("cn/itcast/spring0401/initdestroy/applicationContext.xml");
- HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
- helloWorld.say();
- context.destroy();//销毁spring容器
- }
- }
hello
Source code |
- package cn.itcast.spring0401.initdestroy;
- import java.util.ArrayList;
- import java.util.List;
- public class HelloWorld {
- public void say(){
- System.out.println("hello");
- }
- public void init(){
- System.out.println("init");
- }
时间: 2024-11-08 20:59:11