spring2.5IOC控制反转详解
基本的代码结构
1 IOC包下
基本的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"
- 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类
- package cn.itcast.spring0401.ioc;
- public class HelloWorld {
- public void say(){
- System.out.println("hello");
- }
- }
测试类
这就是控制反转
- 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包,别名
配置文件,可以给类起别名
- <?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>
测试方法
- 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 创建对象的几种方法
* 利用默认的构造函数
* 利用静态工厂方法
* 利用实例工厂方法
配置文件
- <?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>
工厂类
- package cn.itcast.spring0401.createbean;
- public class HelloWorldFactory {
- /**
- * 工厂方法
- * @return
- */
- public static HelloWorld createBean(){
- return new HelloWorld();
- }
- }
helloworld
测试类
- 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容器启动的时候,是检验不出错误的
配置文件
- <?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
测试
- 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中有资源对象,手动关闭
配置
- <?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>
测试
- 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
对象的初始化,销毁
配置文件
- <?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>
测试
- 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
spring2.5IOC控制反转详解的更多相关文章
- 分享知识-快乐自己:Spring_IOC(控制反转)详解
IoC是什么: 1):Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想. 2):在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的 ...
- Spring IOC(控制反转)详解及示例
控制反转——Spring通过一种称作控制反转(IOC)的技术促进了低耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象.你可以认为IoC与JN ...
- coding++:Spring_IOC(控制反转)详解
IoC是什么: 1):Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想. 2):在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的 ...
- M1卡区块控制位详解
M1卡区块控制位详解 Mifare 1S50/Mifare 1S70 每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取 控制.存取控制为4个字节,共32位,扇区中的每个块(包括 ...
- php_ThinkPHP的RBAC(基于角色权限控制)详解
一.什么是RBAC 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. 在RBAC中,权限与角色相关联,用户通 ...
- ThinkPHP框架下基于RBAC的权限控制模式详解
这几天因为要做一个项目,需要可以对Web应用中通用功能进行封装,其中一个很重要的涉及到了对用户.角色和权限部分的灵活管理.所以基于TP框架自己封装了一个对操作权限和菜单权限进行灵活配置的可控制模式. ...
- struts2标签库----控制标签详解
前面几篇文章我们介绍了有关struts2的基本内容,简单理解了整个框架的运作流程.从本篇开始我们逐渐了解和使用struts2为我们提供的标签库技术,使用这些标签可以大大降低我们表现层的开发难 ...
- 单片机pwm控制基本原理详解
前言 PWM是Pulse Width Modulation的缩写,它的中文名字是脉冲宽度调制,一种说法是它利用微处理器的数字输出来对模拟电路进行控制的一种有效的技术,其实就是使用数字信号达到一个模拟信 ...
- 两种RBAC权限控制模型详解
序言 由于最近一直卡在权限控制这个坎上,原来设计的比较简单的权限控制思路已经无法满足比较复杂一些的场景,因此一直在探索一种在大部分场景下比较通用的权限模型. 首先,这里说明一下两种RBAC权限模型分别 ...
随机推荐
- oracle 数据库用户登录相关
oracle 数据库的安装 : 一: 安装的时候可以设定解锁的用户 一般默认是解锁soctt用户和hr用户 : oracle的超级用户是sysdba这个用户在安装的时候也可以设置密码,一 般自己使 ...
- 在树莓派上安装leanote
作者:冥王星 "noright0@163.com" 前言 宿舍有个树莓派2B,连接到电视机,安装OSMC系统,USB接口连接移动硬盘一块,平时用来BT下载和看电影.美剧. OSMC ...
- nginx日志管理与限速
1.日志简介nginx日志主要有两种:访问日志和错误日志.访问日志主要记录客户端访问nginx的每一个请求,格式可以自定义:错误日志主要记录客户端访问nginx出错时的日志,格式不支持自定义.两种日志 ...
- 记一次 java程序优化
优化原因 环境中部署两个程序: web应用 tomcat 10G(webservice服务端,前端web服务) java应用 5G(webservice客户端,sock ...
- exe可执行程序及堆栈分配(转载)
可执行程序的内存分布 GNU编译器生成的目标文件默认格式为elf(executive linked file)格式,这是Linux系统所采用的可执行链接文件的通用文件格式.elf格式由若干个段(sec ...
- MySQL的备份和还原
MySQL的备份和还原 备份:副本 RAID1,RAID10:保证硬件损坏而不会业务中止: DROP TABLE mydb.tb1; 备份类型: 热备份.温备份和冷备 ...
- Linux 文件系统同步
同步就是将物理内存中dirty的页写入到磁盘中,保证磁盘和物理页之间的内容一致. 触发同步操作的时机: 1.周期性内核线程,扫描脏页,根据一定的规则选择脏页,将页写回到磁盘. 2.如果内核中的脏页过多 ...
- GridView视图
本文实现如下效果 Test_Grid.java public class Test_Grid extends Activity { private GridView gridview; private ...
- ZooKeeper的学习与应用
近期大概学习了一下ZooKeeper,本身并没有深入.LGG尝试着在虚拟机里面搭了平台,看了看一些教材,从网上到处看别人的博文并引用之,还请各位大牛们谅解我的剽窃.现总结例如以下. 1. ZooKee ...
- 几个检查当前运行的LINUX是在VM还是在实体机中的方法
昨天提到了VM中的逃逸问题,要想逃逸,首先要检测当前操作系统是否为VM,下面提供几个LINUX下的检查方法: 第一,首推facter virtual ,权限为普通用户,约定,普通用户命令提示符用$表示 ...