`
szlxh002
  • 浏览: 34469 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Ioc容器装配Bean的方法

 
阅读更多

一、基于XML的方法

1.属性的注入

	<bean id="car" class="com.baobaotao.ditype.Car">
		<property name="brand" value="红旗&amp;CA72"/>
		<property name="maxSpeed" value="200"/>
		<property name="price" value="20000.00"/>
	</bean>
	<bean id="boss" class="com.baobaotao.ditype.Boss">
		<property name="car" ref="car"/>
	</bean>

 也可以用简写的方式:

 

  <bean id="car" class="com.baobaotao.ditype.Car"
      p:brand="红旗&amp;CA72"
      p:maxSpeed="200"
      p:price="20000.00"/>
  <bean id="boss" class="com.baobaotao.ditype.Boss"
	  p:car-ref="car"/>

有字面值属性:

	<bean id="car" class="com.baobaotao.attr.Car" lazy-init="default">
		<property name="brand">
			<value>
				<![CDATA[红旗&CA72]]>
			</value>
		</property>
		<property name="maxSpeed">
			<value>200</value>
		</property>
		<property name="price" value="2000.00" />
	</bean>

   

 

2.构造函数注入

根据type

 

	<bean id="car1" class="com.baobaotao.ditype.Car">
		<constructor-arg type="java.lang.String">
			<value>红旗CA72</value>
		</constructor-arg>
		<constructor-arg type="double">
			<value>20000</value>
		</constructor-arg>
	</bean>

 根据index

 

	<bean id="car2" class="com.baobaotao.ditype.Car">
		<constructor-arg index="0" value="红旗CA72" /> 
		<constructor-arg index="1" value="中国一汽" />
		<constructor-arg index="2" value="20000" />
	</bean>

 根据type和index

 

       <bean id="car3" class="com.baobaotao.ditype.Car">
		<constructor-arg index="0" type="java.lang.String">
			<value>红旗CA72</value>
		</constructor-arg>
		<constructor-arg index="1" type="java.lang.String">
			<value>中国一汽</value>
		</constructor-arg>
		<constructor-arg index="2" type="int">
			<value>200</value>
		</constructor-arg>
	</bean>

 

 

3.工厂方法注入

     <bean id="carFactory" class="com.baobaotao.ditype.CarFactory" />
     <bean id="car5" factory-bean="carFactory" factory-method="createHongQiCar">
      </bean>

 4.内部Bean

 

	<bean id="boss2" class="com.baobaotao.attr.Boss">
		<property name="car">
			<bean class="com.baobaotao.attr.Car">
				<property name="maxSpeed" value="200" />
				<property name="price" value="2000.00" />
			</bean>
		</property>
	</bean>

 5.继承类

	<bean id="parentBoss" abstract="true"
		class="com.baobaotao.attr.Boss">
		<property name="favorites">
			<set>
				<value>看报</value>
				<value>赛车</value>
				<value>高尔夫</value>
			</set>
		</property>
	</bean>
	<bean id="childBoss" parent="parentBoss">
		<property name="favorites">
			<set merge="true">
				<value>爬山</value>
				<value>游泳</value>
			</set>
		</property>
	</bean>	

 

 

 

6.集合类

	<bean id="boss1" class="com.baobaotao.attr.Boss">
		<property name="car" ref="car" />
		<property name="favorites1">
			<set>
				<value>看报</value>
				<value>赛车</value>
				<value>高尔夫</value>
			</set>
		</property>
		<property name="favorites2">
			<list>
				<value>看报</value>
				<value>赛车</value>
				<value>高尔夫</value>
			</list> 
		</property>
		<property name="jobs">
			<map>
				<entry >
					<key>
						<value>AM</value>
					</key>
					<value>会见客户</value>
				</entry>
				<entry>
					<key>
						<value>PM</value>
					</key>
					<value>公司内部会议</value>
				</entry>
			</map>
		</property>
		<property name="mails">
			<props>
				<prop key="jobMail">john-office@baobaotao.com</prop>
				<prop key="lifeMail">john-life@baobaotao.com</prop>
			</props>
		</property>
	</bean>

 

 7.FactoryBean

Java Bean

 

package com.baobaotao.fb;

import org.springframework.beans.factory.FactoryBean;

public class CarFactoryBean implements FactoryBean<Car> {

	private String carInfo;
	public String getCarInfo() {
		return carInfo;
	}

	public void setCarInfo(String carInfo) {
		this.carInfo = carInfo;
	}

	public Car getObject() throws Exception {
		Car car = new Car();
		String[] infos = carInfo.split(",");
		car.setBrand(infos[0]);
		car.setMaxSpeed(Integer.parseInt(infos[1]));
		car.setPrice(Double.parseDouble(infos[2]));
		return car;
	}

	public Class<Car> getObjectType() {
		return Car.class;
	}

	public boolean isSingleton() {
		return false;
	}
}

 XML

	<bean id="car1" class="com.baobaotao.fb.CarFactoryBean"
	      p:carInfo="红旗CA72,200,20000.00"/>

 

 8.properties读取

   	<context:property-placeholder
		 location="classpath:com/baobaotao/placeholder/jdbc.properties"/>
	<context:component-scan base-package="com.baobaotao.beanprop"/>	 
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close" 
		p:driverClassName="${driverClassName}" 
		p:url="${url}"
		p:username="${userName}" 
		p:password="${password}" />

 

 

 

二、基于注解的方法

java类使用下面的注解:

@Component

@Repository

@Service

@Controller

package com.baobaotao.anno;

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Scope("session")
@Service
public class LogonService implements BeanNameAware{
	@Autowired(required=false)
	private LogDao logDao;
	@Autowired
	@Qualifier("userDao")
	private UserDao userDao;
	
	public LogDao getLogDao() {
		return logDao;
	}
	public UserDao getUserDao() {
		return userDao;
	}
	
	public void setBeanName(String beanName) {
		System.out.println("beanName:"+beanName);		
	}
	
	public void initMethod1(){
		System.out.println("initMethod1");
	}
	public void initMethod2(){
		System.out.println("initMethod2");
	}
//	@Autowired
//	public void setLogDao(LogDao logDao) {
//		this.logDao = logDao;
//	}
//	
//	@Autowired
//	@Qualifier("userDao")
//	public void setUserDao(UserDao userDao) {
//		System.out.println("auto inject");
//		this.userDao = userDao;
//	}
//	@Autowired
//	public void init(@Qualifier("userDao")UserDao userDao,LogDao logDao){
//		System.out.println("multi param inject");
//		this.userDao = userDao;
//		this.logDao =logDao;
//	}
	
}

 

 

 

 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" 
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd"
         >
   <context:component-scan base-package="com.baobaotao.anno"/>
   <bean class="com.baobaotao.anno.LogonService"></bean>

   <!--
   <context:component-scan base-package="com.baobaotao" resource-pattern="anno/*.class"/>
   <context:component-scan base-package="com.baobaotao">
       <context:include-filter type="regex" expression="com\.baobaotao\.anno.*Dao"/>
       <context:include-filter type="regex" expression="com\.baobaotao\.anno.*Service"/>
       <context:exclude-filter type="aspectj" expression="com.baobaotao..*Controller+"/>
   </context:component-scan>


   <context:component-scan base-package="com.baobaotao">
       <context:include-filter type="aspectj" expression="com.baobaotao.anno.*Plugin+"/>
       <context:include-filter type="aspectj" expression="com.baobaotao.anno.MyComponent"/>
   </context:component-scan>
   -->	
</beans>

 

 三、基于java类的配置

    Spring提供一个AnnotationConfigApplicationContext类,它能够直接通过标注@Configuration的Java类启动Spring容器:

Java Code:

package com.baobaotao.conf;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class JavaConfigTest {
	public static void main(String[] args) {
		
//1.通过构造函数加载配置类		
//         ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf.class);

//2.通过编码方式注册配置类
//		 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
//		 ctx.register(DaoConfig.class);
//		 ctx.register(ServiceConfig.class);
//		 ctx.refresh();

//3.通过XML组装@Configuration配置类所提供的配置信息
//		 ApplicationContext ctx = new ClassPathXmlApplicationContext("com/baobaotao/conf/beans2.xml");

//4.通过@Configuration组装XML配置所提供的配置信息
//		 ApplicationContext ctx = new AnnotationConfigApplicationContext(LogonAppConfig.class);

		//5.@Configuration的配置类相互引用
		 ApplicationContext ctx = new AnnotationConfigApplicationContext(DaoConfig.class,ServiceConfig.class);
         LogonService logonService = ctx.getBean(LogonService.class);
         System.out.println((logonService.getLogDao() !=null));
         logonService.printHelllo();   
	}
}

 DaoConfig java code:

 

package com.baobaotao.conf;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class DaoConfig {
    
	
	@Bean(name="")
	public UserDao userDao(){
		return new UserDao();
	}
	
	@Scope("prototype")
	@Bean
	public LogDao logDao(){
		return new LogDao();
	}
}

 ServiceConfig java code:

 

package com.baobaotao.conf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

@Configuration
@Import(DaoConfig.class)
public class ServiceConfig {
	
    @Autowired
	private DaoConfig daoConfig;
    
	@Bean
	public LogonService logonService(){
		LogonService logonService = new LogonService();
		System.out.println(daoConfig.logDao() == daoConfig.logDao());
		logonService.setLogDao(daoConfig.logDao());
		logonService.setUserDao(daoConfig.userDao());
		return logonService;
	}
}

 

 

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" 
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	<context:component-scan base-package="com.baobaotao.conf"
		resource-pattern="AppConf.class" />
</beans>

 

 四、三种方式的比较

  XML 注解 Java类
适合场景

1.Bean实现类来源于第三方类库,如Datasource、JdbcTemplete、HibernateTemplate等;

2.命名空间的配置,如aop、context等

Bean的实现类是当前项目开发的,可以直接在Java类中使用基于注解的配置,如DAO,Service,Controller类 通过代码的方式控制Bean初始化的整体 ,实例化Bean的逻辑比较复杂的情况

 

分享到:
评论

相关推荐

    第四章 在Ioc容器中装配Bean

    Spring IoC容器在装配Bean时还可以应用生命周期回调,例如实现InitializingBean和DisposableBean接口,或者使用@PostConstruct和@PreDestroy注解,可以在Bean的生命周期的特定点执行代码。 除了上述提到的装配方式...

    spring在IoC容器中装配Bean详解

    Spring 在 IoC 容器中装配 Bean 详解 ...Spring 在 IoC 容器中装配 Bean 的过程包括配置概述、Bean 基本配置、依赖注入、自动装配和方法注入等步骤。了解这些步骤可以帮助开发者更好地使用 Spring 框架来开发应用程序。

    模拟Spring的IoC容器实现注解自动装配

    最后,通过实际运行一些示例代码,验证我们的模拟IoC容器是否能正确地自动装配bean的依赖,确保功能完备。 以上就是模拟Spring的IoC容器实现注解自动装配的主要步骤和关键点。虽然这个实现可能不会涵盖Spring的所有...

    IoC容器的设计(利用反射、注解和工厂模式实现)

    实验要求 1. 利用注解、反射和工厂模式设计一个简单的IoC容器 2. 该IoC容器包含3个注解和一个IoC容器类(AnnotationConfigApplicationContext),其定义...接下来在test类中实例化IoC容器,并从中取得bean,调用其方法

    Spring IOC容器实现分析.pdf 下载

    2. Bean的实例化:当需要使用某个Bean时,IOC容器会根据Bean的定义创建实例。可以是单例模式,也可以是多例模式。 3. 依赖注入:在实例化Bean的过程中,容器会根据定义的依赖关系,将其他Bean注入到当前Bean中,...

    手写一个SpringIoc容器

    本项目"手写一个SpringIoc容器"旨在模仿Spring的IOC(Inversion of Control,控制反转)功能,帮助开发者深入理解Spring的工作原理,提升对依赖注入(Dependency Injection)模式的认识。 在实现自定义的Spring IOC...

    Spring IoC容器实现的结构分析

    在执行过程中,Spring IoC容器首先通过`BeanDefinitionReader`加载和解析bean定义,然后`BeanFactory`根据`BeanDefinition`创建bean实例。如果bean配置了自动装配,`AutowireCapableBeanFactory`会处理依赖注入。...

    spring IOC反射装载bean

    在Spring框架中,IOC(Inversion of Control,控制反转)是一种设计原则,它将对象的创建和管理交给了容器来处理。在这个特定的"spring IOC反射装载bean"的主题中,我们将深入探讨Spring如何通过XML配置文件来加载和...

    Spring源代码解析(一):IOC容器.doc

    理解Spring的IOC容器,尤其是BeanFactory接口,有助于深入探究Spring如何管理对象的生命周期、依赖关系和装配过程。通过源代码阅读,我们可以看到Spring如何优雅地将这些复杂的概念转化为可扩展和灵活的代码,从而更...

    简单IOC容器demo

    【标题】:“简单IOC容器demo”是一个演示性的项目,它旨在教授如何构建一个基础的控制反转(IOC)容器。这个容器使用注解来实现依赖注入,这是Spring框架的核心特性之一。 【描述】:该示例项目是学习过程的产物,...

    Spring源代码解析(二):IoC容器在Web容器中的启动.doc

    它会根据依赖关系自动装配bean,处理单例bean的初始化,以及处理任何配置的bean后处理器和初始化回调方法。 在Web MVC场景下,除了根`WebApplicationContext`外,还会创建一个或多个子`WebApplicationContext`,...

    实现Spring那样的Ioc注解装配

    首先,我们需要创建一个IoC容器,这个容器将负责对象的创建和管理。容器应该具备扫描类路径,识别注解,以及根据注解进行实例化和装配的能力。这通常包括以下步骤: 1. **类扫描**:扫描指定的包或类路径,找出所有...

    自定义IOC容器

    IOC容器是Spring框架的核心,它负责管理和装配应用中的对象,实现了依赖注入,降低了代码间的耦合度。通过自行实现IOC容器,开发者可以更直观地掌握其工作机制,提升对Spring的理解。 在Spring框架中,IOC容器的...

    Spring的IoC容器

    - **AOP代理**:IoC容器可以结合Spring的面向切面编程(AOP)功能,为Bean创建代理,实现横切关注点。 - **装配策略**:如按类型装配、按名称装配、自动装配等,可以根据需求选择合适的装配策略。 - **Profile支持...

    IOC容器 mini-container

    4. **Bean的生命周期管理**:IOC容器通常负责Bean的生命周期,包括创建、初始化、使用和销毁。mini-container可能提供了相应的API来控制这些生命周期方法的执行。 5. **AOP(面向切面编程)支持**:虽然描述中没有...

    spring ioc容器部署实现

    IoC容器是Spring框架的重要组成部分,它负责管理对象的生命周期、配置和装配过程。通过Spring IoC容器,开发者可以将对象间的依赖关系交给Spring容器进行管理,从而实现对象间的解耦。 #### 二、Spring IoC容器的...

    IoC 容器和Dependency Injection 模式

    开发者定义对象的配置,比如bean定义,容器根据这些配置在运行时创建并装配对象。Spring支持多种注入方式,包括构造器注入、setter注入和接口注入。 以文章中提到的`MovieLister`为例,`MovieLister`依赖于`Finder`...

    Spring2[1].5_IoC(控制反转)容器之容器与Bean(附示例)

    - 每个Bean都有一个或多个id(标识符),每个id在当前的IoC容器中必须是唯一的。可以通过`id`或`name`属性来指定Bean的标识符。如果希望指定多个id作为Bean的别名,可以在`name`属性中使用逗号、空格或冒号分隔。 ...

    Spring2的IOC利器统管Bean世界.rar

    `@Component`注解用于标记一个类为Spring Bean,而`@Autowired`则用于自动装配Bean的依赖。这种方式使得代码更加简洁,同时也更易于理解和维护。 此外,Spring的IOC容器还提供了许多高级特性,比如作用域(Scope)...

    山寨spring_ ioc容器

    通常,这样的项目可能会包含一些简单的示例,展示如何创建Bean、配置依赖以及如何启动和使用IoC容器。博文链接指向了一个ITeye博客,可以提供更详细的信息,例如项目的实现原理、代码结构和使用方法。 从标签“源码...

Global site tag (gtag.js) - Google Analytics