Spring的IoC容器
Spring是一个轻量级的Java开发框架,其提供的两大基础功能为IoC和AOP,其中IoC为依赖反转(Inversion of Control)。IOC容器的基本理念就是“为别人服务”,那为别人服务什么呢?其中最重要就是业务对象的构建管理和业务对象之间的依赖绑定。
IoC容器管理业务对象,首先需要知道业务对象之间的依赖关系,以下有几种方式告诉IoC容器其管理的对象之间的绑定关系:
注意:不管是什么方式来告知IoC容器对象之间的绑定关系,最终都是需要通过编码方式来将这些信息"写入"到IoC容器中的。 一个XML配置方式的示例: <!-- 配置bean,属性配置方式 --> <bean id="helloWorld" class="com.luo.testspring.HelloWorld" scope="singleton"> property name="name" value="spring"/> </bean> ? Spring的IoC容器提供两种基本的容器类型:beanfactory和ApplicationContext。
? beanfactory使用示例(XML配置方式): /* HelloWolrd类,待依赖注入的类 */ public class HelloWorld { private String name; public HelloWorld() { } HelloWorld(String name) { this.name = name; } void setName(String name) { hello() { System.out.println("hello: " + this.name); } } springConfig.xml配置文件Bean配置 --> ="spring"/> > 通过构造方法配置bean属性 ="helloWorld2" class="com.luo.testspring.HelloWorld"constructor-arg value="spring2" index="0"></constructor-arg="helloWorld3"="name"> ="java.lang.String"> ="spring3"/> property> 测试代码 */ beanfactory factory = new Xmlbeanfactory(new ClassPathResource("springConfig.xml")); HelloWorld helloWorld = (HelloWorld) factory.getBean("helloWorld"); helloWorld.hello(); HelloWorld helloWorld2 = factory.getBean("helloWorld2",HelloWorld.); helloWorld2.hello(); HelloWorld helloWorld3 = factory.getBean("helloWorld3",1)">); helloWorld3.hello(); ? ApplicationContext使用示例(XML配置方式): HelloWorld helloWorld = (HelloWorld) ctx.getBean("helloWorld"); helloWorld.hello(); HelloWorld helloWorld2 = ctx.getBean("helloWorld",1)">); helloWorld2.hello(); HelloWorld helloWorld3 = ctx.getBean("helloWorld3",1)">); helloWorld3.hello(); ? 依赖注入的3种方式
? spring的bean配置(XML配置方式) 属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象,使用 <property> 元素,使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值,属性注入是实际应用中最常用的注入方式。属性注入Bean类须有一个默认的构造方法。 Hello类中有一个String类型的msg属性 ="hello"="com.luoxn28.Hello"="msg"="luoxn28"> 通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用,构造器注入在 <constructor-arg> 元素里声明属性。 ="string" 按照索引匹配入参 ="car"="com.luoxn28.Car"="比亚迪"/> ="中国制造"="1"="200000"="2" 按照类型匹配入参 ="car2" type="double"> 组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能。要使 Bean 能够相互访问,就必须在 Bean 配置文件中指定对 Bean 的引用,在 Bean 的配置文件中,可以通过 <ref> 元素或 ref 属性为 Bean 的属性或构造器参数指定对 Bean 的引用。也可以在属性或构造器里包含 Bean 的声明,这样的 Bean 称为内部 Bean。 ref="msg"> 当 Bean 实例仅仅给一个特定的属性使用时,可以将其声明为内部 Bean,内部 Bean 声明直接包含在 <property> 或 <constructor-arg> 元素里,不需要设置任何 id 或 name 属性。内部 Bean 不能使用在任何其他地方。 >
可以通过一组内置的 xml 标签(例如: <list>,<set> 或 <map>) 来配置集合属性。 CollectionClass类有3个属性,List<String> list、Set<String> set、Map<String,String> map="collectionClass"="com.luoxn28.CollectionClass"="list"list>luoxn28>luoxn29>luoxn30="set"set="map"mapentry key="str1"/> ="str2"><entry="str3"> ? Bean的作用域 Spring最初提供两种bean的scope类型:singleton和prototype,在发布2.0之后,新增了request、session和global session类型,不过这3种新增的只能用在Web应用中。可以通过bean属性scope来指定bean的scope类型,如果是singleton类型的话,在用户获取该bean之后,容器还是会接管该bean的生命周期;如果是prototype的话,在用户获取该bean之后,容器就不接管该bean了,也就是容器每次会创建一个新的bean对象返回给用户。 Hello对象每次获取都会新建 ="com.luoxn28.Hello"="prototype"> ? 通过静态方法创建bean 调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中,当用户需要对象时,只需要简单地调用静态方法,而不同关心创建对象的细节。要声明通过静态方法创建的 Bean,需要在 Bean 的 class 属性里指定拥有该工厂的方法的类,同时在 factory-method 属性里指定工厂方法的名称. 最后,使用 <constrctor-arg> 元素为该方法传递方法参数。 static Hello createHello() { return new Hello(); } factory-method="createHello"> ? 通过实例方法创建bean 将对象的创建过程封装到另外一个对象实例的方法里. 当用户需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。要声明通过实例工厂方法创建的 Bean,在 bean 的 factory-bean 属性里指定拥有该工厂方法的 Bean,在 factory-method 属性里指定该工厂方法的名称,使用 construtor-arg 元素为工厂方法传递方法参数。 ? (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |