`
szlxh002
  • 浏览: 33838 次
  • 性别: 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 3.X 企业应用 第四章 在Ioc容器中装配Bean 手机拍的图片,略有缺页

    spring在IoC容器中装配Bean详解

    主要介绍了spring在IoC容器中装配Bean详解,具有一定借鉴价值,需要的朋友可以参考下

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

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

    HelloSpring.zip

    IOC容器获取bean的方式 * 通过id获取名字 * 通过类型获取,ioc中如果出现同类型两个对象,报错 4。bean的作用域 * 单例 scope=“singleton” * 原型 scope=“prototype” 5。bean的生命周期: 默认情况下IOC容器创建...

    模拟实现Spring的IOC

    1、Spring主要两个作用:实例化Bean,动态装配Bean。并将所有的bean放到spring容器中,调用时从容器中取。Spring容器就是一个bean的Map:private Map, Object&gt; beans = new HashMap, Object&gt;(); 2、本工程,模拟...

    springIOC核心组件分析.vsdx

    spring-context:上下文,即IOC容器 spring-context-support:对IOC的扩展,以及IOC子容器 spring-context-indexer:类管理组件和Classpath扫描 spring-expression:表达式语句 切面编程: spring-aop:面向切面编程,...

    spring的详细介绍

    Spring介绍 1. Spring 2. 使用spring的主要目的 3. Spring的模块 Ejb容器(以前是) Ioc容器(现在的控制权) 控制反转Ioc(Invertion of ...12. 定义IoC容器管理的javabean的生命周期回调方法 13. 接口FactoryBean的使用

    Spring相关测试1全部

    Spring中注入属性值细节、自动装配、bean之间的关系、bean的作用域、使用外部属性文件、SpEL、IOC容器中Bean 的生命周期、泛型依赖注入。

    SpringBoot Bean的生命周期demo.zip

    一般情况下,我们只是关心如何正确地将Bean装配到容器中,并不关心Ioc容器是如何装配和销毁Bean的过程。但是恰恰有时候,我们需要自定义初始化或销毁Bean的过程,以满足一些“特殊的”需求。比如,数据源在关闭的...

    go-spring:基于IoC的Go一级一站式开发框架:rocket:

    IoC容器Go-Spring不仅实现了如Java Spring那般功能强大的IoC容器,还扩展了Bean的概念。在Go中,对象(即指针),数组,地图,函数指针,这些都是Bean,都可以放到IoC容器里。常用的Java Spring注解对应的Go

    9pound#Accumulate#自动装配的原理1

    自动装配的原理自动装配的含义:自动将Bean装配到IOC容器当中核心注解@SpringBootApplication* Indicates a {@link C

    Spring 3 Reference中文

    4.1 Spring IoC 容器和bean 的介绍 29 4.2 容器概述 29 4.2.1 配置元数据.. 30 4.2.2 实例化容器.. 31 4.2.2.1 处理基于XML 的配置元数据. 32 4.2.3 使用容器. 33 4.3 Bean 概述 34 ...

    Spring从入门到入土——Bean的作用域

    Bean的作用域Bean的作用域SingletonPrototypeRequestSessionGlobal Session 相关文章 跟着官网学spring—快速入门指南 跟着官网学Spring—构建RESTful Web服务 ...简单地讲,bean就是由IoC容器初始化、装配及管理的

    spring-beans.zip

    它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中&lt;bean/&gt; 的形式定义。Spring 框架定义的beans都是单件beans。在bean tag中有个属性”singleton”,如果它被赋为...

    spring学习心得

    Spring容器的特点 (1)容器对对象的管理 a.创建时机:默认和容器一起创建。 可以使用&lt;bean lazy-init=""/&gt;延缓实例化 可以使用延缓所有组件实例化 b.销毁时机:单例对象容器close()负责销毁 c.创建对象的模式...

    Java Web开发技术大全

    本书内容包括Web客户端技术、JSP/Servlet技术、Struts 2(拦截器、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring(Ioc容器、装配Java Bean、Jdbc和Hibernate模板、事务管理、...

    spring-learn:Spring轻松学习demo

    1.弹簧IOC容器 1.弹簧注入方式 set方法注入 构造方法注入 2.Bean的装配 1.豆的作用域 单例单例获取 原型每次请求都创建实例 2.豆的生命周期 定义,初始化,使用,销毁 待补充... 3.意识到弹簧-让bean获取spring容器...

    77道Spring面试题以及参考答案(2024年最新版)

    2. IoC和DI部分重点解释了IoC容器、依赖注入的原理和作用。 3. Spring Bean部分围绕Bean的生命周期、作用域、自动装配等进行了详细阐述。 4. 注解部分列举了常用的Spring注解及其作用,如@Component、@Autowired等...

    Spring面试题含答案.pdf

    13. 什么是 Spring IOC 容器? 14. IOC 的优点是什么? 15. ApplicationContext 通常的实现是什么? 16. Bean 工厂和 Application contexts 有什么区别? 17. 一个 Spring 的应用看起来象什么? 18. 什么是 Spring ...

    Spring.3.x企业应用开发实战(完整版).part2

    第4章 在IoC容器中装配Bean 4.1 Spring配置概述 4.1.1 Spring容器高层视图 4.1.2 基于XML的配置 4.2 Bean基本配置 4.2.1 装配一个Bean 4.2.2 Bean的命名 4.3 依赖注入 4.3.1 属性注入 4.3.2 构造函数注入 4.3.3 工厂...

Global site tag (gtag.js) - Google Analytics