- 浏览: 17531 次
- 性别:
- 来自: 南京
文章分类
最新评论
在IoC容器中装配Bean
4.1.2.RELEASE版本的Spring支持3种配置方式
1.基于XML的配置
这种方式是经典方式,即使Spring不断发展,也必须向前兼容这种方式。装配一个Bean有3种方式。
1.1 属性注入
这种方式是最常用的方式,基于POJO类中的Set方法,为属性注入参数。
可以在main方法中使用如下方法可以访问
*****需要注意的是,在配置Bean的Property时,比如<property name="brand"/>,Spring仅要求必须存在setBrand()方法,不一定要拥有brand成员变量
1.2 构造函数注入
1.2.1 按构造函数的参数的类型进行匹配入参
****注意,这种方式,根据入参类型就可以确定如何绑定的情况下不需要保证顺序和Java构造方法的参数顺序一致。
1.2.2 按索引匹配入参
如果入参存在两个相同类型的参数,那使用上面一种方式就没办法唯一确定了,这个时候需要根据入参的索引来确定,第一个参数的索引是"0",第二个是"1",一次类推
1.2.3 联合使用类型和索引匹配入参
如果分别使用上面两种方式还是没有办法绑定,比如有多个构造函数,其中有一个参数类型不同,这种情况下可以联合使用上面两种方法。
1.2.4 通过反射匹配入参
如果入参的类型是可以辨别的,比如自定义的Car类,Office类这种,在构造函数中引用了这些类,在XML配置的时候,可以不加type和index,由框架自动注入。
1.3 工厂方法注入
分静态工厂方法和非静态工厂方法,这种方法在IoC中用的不多,就跳过不提了。
2.基于注解的方式
基于XML的方式实在过繁杂,书写起来也容易犯错,所以现在更多的是使用基于注解的方式。
在使用基于注解的方式配置Bean之前,需要先告诉Spring有哪些程序包是需要被扫描的
<context-component-scan base-package="com.firethewhole.maventest05.anno/>
以上只是最简单的方式,还可以在其中配置和除外和包含的基于正则或其他方式的匹配。
然后在Bean定义时,对类加上@Component,@Repository,@Service,@Controller之类的注解即可。
对类中定义的属性可以使用@Autowired进行自动注入,会按照优先类型匹配的方式进行自动注入。
required属性,在没有匹配的时候也不会报错,这个值默认是true
@Qualifier注解可以指定注入的Bean的名称,
@Scope注解Bean的作用范围
@PostConstruct,@PreDestroy对应init-method和destroy-method
3.基于Java类的注解
这种方式由@Configuration注解定义配置文件Java类,通过@Bean进行Bean的定义。通常对程序员更加友好。
3.1 标准方式
通过以下方式可以启动容器
像上面这个例子里面,UserDao和LogDao实际上是加上了Getter Setter方法的,实际上没必要在这两个Dao中加上Setter方法,只需要在LogonService中给这两个属性加上@Autowired注解,就会自动注入了。
3.2 多Config文件组合
如下,如果没有使用Import注解的话,需要在启动容器的时候,把所有的Java注解配置类都注册上
3.3 在XML配置中引用@Configuration配置,很简单,只需要<context:component-scan>可以扫描到即可。
3.4 在Configuration中引用XML配置信息,只需要在类上加上@ImportResource("classpath:com/firethewhole/conf/bean3.xml"),然后对应的每个方法都需要参数并且加上Autowired属性
4.1.2.RELEASE版本的Spring支持3种配置方式
- 基于XML配置
- 基于注解
- 基于Java类
1.基于XML的配置
这种方式是经典方式,即使Spring不断发展,也必须向前兼容这种方式。装配一个Bean有3种方式。
1.1 属性注入
这种方式是最常用的方式,基于POJO类中的Set方法,为属性注入参数。
public class Car { private int maxSpeed; private String brand; private double price; // Getter Setter // introduce方法将各参数打印出来 }
<bean id="car" class="com.firethewhole.maventest05.ditype.Car"> <property name="maxSpeed"><value>100</value></property> <property name="brand"><value>红旗CA97</value></property> <property name="price"><value>20000.00</value></property> </bean>
可以在main方法中使用如下方法可以访问
ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml"); Car car = (Car) application.getBean("car"); System.out.println(car.introduce());
*****需要注意的是,在配置Bean的Property时,比如<property name="brand"/>,Spring仅要求必须存在setBrand()方法,不一定要拥有brand成员变量
1.2 构造函数注入
1.2.1 按构造函数的参数的类型进行匹配入参
public Car(String brand, double price) { this.brand = brand; this.price = price; }
<bean id="car" class="com.firethewhole.maventest05.ditype.Car"> <constructor-arg type="java.lang.String"> <value>红旗CA72</value> </constructor-arg> <constructor-arg type="int"> <value>70</value> </constructor-arg> <constructor-arg type="double"> <value>20000</value> </constructor-arg> </bean>
****注意,这种方式,根据入参类型就可以确定如何绑定的情况下不需要保证顺序和Java构造方法的参数顺序一致。
1.2.2 按索引匹配入参
如果入参存在两个相同类型的参数,那使用上面一种方式就没办法唯一确定了,这个时候需要根据入参的索引来确定,第一个参数的索引是"0",第二个是"1",一次类推
<bean id="car" class="com.firethewhole.maventest05.ditype.Car"><bean id="car" class="com.firethewhole.maventest05.ditype.Car"> <constructor-arg index="0" value="红旗CA72" /> <constructor-arg index="1" value="中国一汽" /> <constructor-arg index="2" value="20000" /> </bean>
1.2.3 联合使用类型和索引匹配入参
如果分别使用上面两种方式还是没有办法绑定,比如有多个构造函数,其中有一个参数类型不同,这种情况下可以联合使用上面两种方法。
1.2.4 通过反射匹配入参
如果入参的类型是可以辨别的,比如自定义的Car类,Office类这种,在构造函数中引用了这些类,在XML配置的时候,可以不加type和index,由框架自动注入。
public Boss(String name, Car car, Office office) { // 省略 }
<bean id="boss" type="com.firethewhole.maventest05.ditype.Boss"> <consturctor-arg> <value>John</value> </constructor-arg> <constructor-arg> <ref bean="car"/> </constructor-arg> <constructor-arg> <ref bean="office"/> </constructor-arg> </bean> <bean id="car" class="com.firethewhole.maventest05.ditype.Car"/> <bean id="office" class="com.firethewhole.maventest05.ditype.Office"/>
1.3 工厂方法注入
分静态工厂方法和非静态工厂方法,这种方法在IoC中用的不多,就跳过不提了。
2.基于注解的方式
基于XML的方式实在过繁杂,书写起来也容易犯错,所以现在更多的是使用基于注解的方式。
在使用基于注解的方式配置Bean之前,需要先告诉Spring有哪些程序包是需要被扫描的
<context-component-scan base-package="com.firethewhole.maventest05.anno/>
以上只是最简单的方式,还可以在其中配置和除外和包含的基于正则或其他方式的匹配。
然后在Bean定义时,对类加上@Component,@Repository,@Service,@Controller之类的注解即可。
对类中定义的属性可以使用@Autowired进行自动注入,会按照优先类型匹配的方式进行自动注入。
required属性,在没有匹配的时候也不会报错,这个值默认是true
@Qualifier注解可以指定注入的Bean的名称,
@Scope注解Bean的作用范围
@PostConstruct,@PreDestroy对应init-method和destroy-method
3.基于Java类的注解
这种方式由@Configuration注解定义配置文件Java类,通过@Bean进行Bean的定义。通常对程序员更加友好。
3.1 标准方式
@Configuration public class AppConf { @Bean public UserDao userDao() { return new UserDao(); } @Bean public LogDao logDao() { return new LogDao(); } @Bean public LogonService logonService() { LogonService logonService = new LogonService(); logonService.setUserDao(userDao());// 看下面注释 logonService.setLogDao(logDao()); return logonService; } }
通过以下方式可以启动容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf.class); LogonService logonService = ctx.getBean(LogonService.class); logonService.printHello();
像上面这个例子里面,UserDao和LogDao实际上是加上了Getter Setter方法的,实际上没必要在这两个Dao中加上Setter方法,只需要在LogonService中给这两个属性加上@Autowired注解,就会自动注入了。
3.2 多Config文件组合
@Configuration public class DaoConfig { @Bean public UserDao userDao() { return new UserDao(); } @Scope("prototype") @Bean public LogDao logDao() { return new LogDao(); } } @Configuration @Import(DaoConfig.class) // 使用这行代码就就可以引用其他的注解配置类 public class ServiceConfig { @Autowired private DaoConfig daoConfig; @Bean public LogonService logonService() { LogonService logonService = new LogonService(); // 这里没有加上Setter方法,是因为LogonService中使用了Autowired注解 return logonService; } }
如下,如果没有使用Import注解的话,需要在启动容器的时候,把所有的Java注解配置类都注册上
AnnotationConfigApplicationContext ctx1 = new AnnotationConfigApplicationContext(); // ctx1.register(DaoConfig.class); // 如果没有使用Import注解的话,一定要记得加上 ctx1.register(ServiceConfig.class); ctx1.refresh(); LogonService logonService1 = ctx1.getBean(LogonService.class); logonService1.printHello();
3.3 在XML配置中引用@Configuration配置,很简单,只需要<context:component-scan>可以扫描到即可。
3.4 在Configuration中引用XML配置信息,只需要在类上加上@ImportResource("classpath:com/firethewhole/conf/bean3.xml"),然后对应的每个方法都需要参数并且加上Autowired属性
@Configuration @ImportResource("classpath:beans3.xml") public class LogonAppConfig { @Bean @Autowired public LogonService logonService(UserDao userDao, LogDao logDao) { LogonService logonService = new LogonService(); logonService.setLogDao(logDao); logonService.setUserDao(userDao); return logonService; } }
<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-4.1.xsd"> <bean id="userDao" class="com.firethewhole.maventest05.dao.UserDao"/> <bean id="logDao" class="com.firethewhole.maventest05.dao.LogDao"/> </beans>
- maventest05.zip (22.4 KB)
- 下载次数: 0
发表评论
-
Spring基础:数据访问(3)
2017-01-15 09:29 441在开源世界里,有很多ORM框架使用,比如Hibernate,还 ... -
Spring基础:数据访问(2)
2016-12-31 10:55 535上一篇主要将了Spring JDB ... -
Spring基础:数据访问(1)
2016-12-27 08:22 385Spring JDBC通过模板和回调机制大大降低了使用JDBC ... -
Spring基础:AOP编程(5)
2016-11-30 07:35 382基于Schema的AOP编程 基于AspectJ的AOP编程已 ... -
Spring基础:AOP编程(4)
2016-11-27 12:17 415基于AspectJ的AOP编程 AspectJ的切点函数非常 ... -
Spring基础:AOP编程(3)
2016-11-19 10:44 383基于切面的AOP编程 通过Advice,可以创建方法前,后, ... -
Spring基础:AOP编程(2)
2016-11-15 23:40 413基于ProxyFactory的AOP编程 Spring只支持 ... -
Spring基础:AOP编程(1)
2016-11-14 01:08 421Java编程中的代理 Spring以IoC为基础,发展了另外 ... -
Spring基础:IoC容器(2)
2016-11-12 10:00 451容器注入类型 最常见的注入类型是字面值注入,像String和 ... -
Spring基础:稍显复杂的Spring Hello World
2016-11-01 00:59 390本文参考《Spring 3.x企业应用开发》这本书完成,作为自 ... -
使用Eclipse创建基于Maven Web工程
2016-06-06 19:19 451第一步:创建一个maven-webapp类型的工程 完 ...
相关推荐
在Spring源代码解析的第一部分,我们将聚焦于IOC容器,特别是BeanFactory接口,它是所有Spring容器的基础。 BeanFactory接口是Spring的基石,它定义了基本的容器操作,如获取Bean、检查Bean是否存在、确定Bean的...
IoC容器是Spring框架的基石,它负责管理对象的生命周期和对象间的依赖关系。通过IoC,我们可以将应用程序的配置和控制权交由容器来处理,从而实现松耦合的设计。 首先,我们需要了解IoC的基本概念。IoC是一种设计...
当我们在Web环境中运行Spring应用时,IoC容器需要在Web容器(如Tomcat、Jetty等)中启动并运行。这个过程涉及到一系列的初始化步骤,确保Spring能够正确地与Web容器集成。 首先,`WebApplicationContext`是`...
IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 优点 1. 简化对象的创建:IoC ...
IoC容器是Spring框架的心脏,它负责管理对象的生命周期和依赖关系,使得开发者能够实现松耦合和高可测试性的应用程序。 首先,我们来理解什么是IoC。IoC,也被称为依赖注入(Dependency Injection),是一种设计...
spring Ioc容器配置 IOC容器数据源配置 <!-- 配置数据源 --> destroy-method="close"> <value>org.gjt.mm.mysql.Driver <value>jdbc:mysql://localhost:3306/demo <value>root ...
总结,Spring的IOC容器是其强大功能的基础,通过控制反转实现了对象的解耦和依赖管理,极大地提高了代码的可维护性和灵活性。理解并熟练运用IOC容器,对于提升Java企业级应用的开发效率具有重要意义。
**Spring的IoC容器详解** Spring框架的核心特性之一是依赖注入(Dependency Injection,简称DI),而实现这一特性的核心组件就是IoC(Inversion of Control)容器。IoC容器是Spring框架的心脏,它负责管理对象的...
### Spring的IoC容器初始化源码解析 #### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented ...
【第四课:IOC容器设计理念与源码解读 (2)1】 本课程主要涵盖了IOC(Inversion of Control,控制反转)的核心理论以及实体Bean的创建方式,深入解析了Spring框架中的IOC设计原理。以下是对这些知识点的详细阐述: ...
1. **松耦合**:由于对象的创建和依赖关系的管理交给了IoC容器,对象与对象之间不再有硬编码的依赖,增强了系统的可维护性。 2. **可测试性**:IoC使我们能够轻松地替换对象的依赖,便于进行单元测试。 3. **重用性*...
本项目"手写一个SpringIoc容器"旨在模仿Spring的IOC(Inversion of Control,控制反转)功能,帮助开发者深入理解Spring的工作原理,提升对依赖注入(Dependency Injection)模式的认识。 在实现自定义的Spring IOC...
而注解自动装配(Autowired)是Spring IoC容器的一种高级特性,它允许我们通过注解来声明对象之间的依赖,无需手动编写XML配置。现在,我们将深入探讨如何模拟Spring的IoC容器实现注解自动装配。 首先,我们需要...
在Java Spring框架中,Spring IoC(Inversion of Control,控制反转)是核心特性之一,它使得应用程序的组件之间的依赖关系不再由代码直接管理,而是交由Spring IoC容器负责。这种设计模式降低了代码间的耦合,提高...
Spring IoC提供了BeanFactory和ApplicationContext两种容器类型,其中BeanFactory是基础的IoC容器,而ApplicationContext则提供了更多高级功能,如资源加载、事件发布等。 Spring IoC的配置主要通过XML或注解的方式...
Spring Ioc容器是整个Spring框架的基石,它负责创建、配置和管理对象。容器通过读取XML、Java注解或Java配置类等方式,获取对象的定义信息,然后根据这些信息实例化对象并进行依赖注入。 **三、依赖注入(DI,...