`
cowwen
  • 浏览: 26681 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring的bean注入的一些理解

阅读更多
对于spring,刚刚学习的,所以有很多都不是很理解,大多数都是只知道要这样做,但是不知道为什么要这样做。
在测试dao层操作的时候,写了一个TestStudentServiceImpl类,field有个private 的 StudentServiceImpl类,需要用spring注入,StudentServiceImpl继承了BaseDaoSupport<Student>类和实现了IStudentService接口。
测试类的代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/applicationContext.xml")
@TestExecutionListeners(
{ DependencyInjectionTestExecutionListener.class })
public class TestStudentService {
	private StudentServiceImpl studentServiceImpl;
	
	private SessionFactory sessionFactory;
	
	@Test
	public void testAddStudent(){
		Student stu = new Student();
		stu.setName("ligang");
		studentServiceImpl.save(stu);
	}
	
	@Transient
	public void testSessionFactory(){
		Student stu = new Student();
		stu.setName("yao");
		stu.setPassword("123456");
		Session sess =sessionFactory.openSession();
		sess.save(stu);
	}

	@Resource(name="studentServiceImpl")
	public void setStudentServiceImpl(StudentServiceImpl ssi){
		this.studentServiceImpl = ssi;
	}
}

applicationContext.xml里的一个片段
<bean id="studentServiceImpl" class="com.lin.service.impl.StudentServiceImpl">
  	<property name="sessionFactory" ref="sessionFactory"/>
</bean>

运行的时候出现了下面的错误,于是查阅了一整的天资料,大概知道些spring在注入bean中好似使用了AOP框架产生代理,产生代理的方式有两种,第一种是实现了接口的类,会使用默认的jdk产生,该方式通过实现目标类的接口,产生一个aop代理类,该aop代理类可能封装了些事务处理,和目标类的方法,所以我们在拿出这个studentServiceImpl 这个bean的时候,其实是这个aop代理,当我们在测试类取出的时候,我们要求注入StudentServiceImpl类,aop代理却不是StudentServiceImpl类,只是和目标类实现了同样的IStudentService接口,所以我们在Test类中,应该使用接口来解决,即将在Test类要求注入的StudentServiceImpl,改为接口IStudentService.
引用

Bean named 'studentServiceImpl' must be of type [com.lin.service.impl.StudentServiceImpl], but was actually of type [$Proxy20]

改之后的Test类代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/applicationContext.xml")
@TestExecutionListeners(
{ DependencyInjectionTestExecutionListener.class })
public class TestStudentService {
	private IStudentService studentServiceImpl;
	
	private SessionFactory sessionFactory;
	
	@Test
	public void testAddStudent(){
		Student stu = new Student();
		stu.setName("ligang");
		studentServiceImpl.save(stu);
	}
	
	@Transient
	public void testSessionFactory(){
		Student stu = new Student();
		stu.setName("yao");
		stu.setPassword("123456");
		Session sess =sessionFactory.openSession();
		sess.save(stu);
	}

	@Resource(name="studentServiceImpl")
	public void setStudentServiceImpl(IStudentService ssi){
		this.studentServiceImpl = ssi;
	}
}

如果目标类没有实现任何接口,将采用第二种的产生代理的方法是CGLIB的字节码生成,该方式是通过产生目标类的子类,产生一个aop代理类,该类也封装了一些事务和目标类的方法,当我们取出的时候,其实也是aop代理类,只不过是目标类的子类。
分享到:
评论

相关推荐

    spring bean XML配置入门

    通过以上内容,你应该对Spring框架中的Bean XML配置有了初步的理解。掌握这些知识点后,你将能够创建基本的Spring应用,并开始探索更高级的特性,如AOP、Spring MVC等。记得实践是检验真理的唯一标准,尝试自己动手...

    spring依赖注入bean

    **Spring 依赖注入 (DI) 与 Bean** Spring 框架的核心特性之一就是依赖注入(Dependency Injection,简称 DI),这是一种设计模式,它允许我们控制组件之间的耦合,而不是让组件自行创建它们所依赖的对象。这有助于...

    通过@Autowired注解注入bean的顺序,以及@bean注入.rar

    1. **类型匹配**:Spring首先尝试按类型匹配bean,找到最适合的bean注入到目标字段或构造函数。 2. **按名称匹配**:如果存在多个相同类型的bean,Spring会检查目标字段或构造函数是否有`@Qualifier`注解,如果有,...

    Spring Bean重复执行两次(实例被构造两次)问题分析

    综上所述,Spring Bean重复执行两次的问题通常是由于配置错误、依赖注入循环、初始化回调的不当使用、静态工厂方法的误用、AOP代理的配置问题或是Bean作用域设置不准确导致的。通过仔细检查和修正这些问题,可以避免...

    spring bean life cycle

    2. **属性注入**:实例化后,Spring会根据Bean定义中的`property`或`ref`属性为Bean注入依赖。这包括了通过setter方法设置值,以及通过构造函数传递参数。 3. **初始化**:在属性注入完成后,Spring会执行Bean实现...

    Spring (bean怎样注入值)学习实例

    在Spring框架中,Bean的注入是其核心特性之一,它允许开发者通过声明式的方式管理对象的依赖关系。本文将深入探讨如何在Spring中通过XML配置文件对Bean进行值的注入,包括List、Set和Map等集合类型的注入。 首先,...

    实例化Spring bean的两种工厂方法

    首先,我们要理解Spring Bean的概念。Spring Bean是Spring IoC容器管理的对象,这些对象的生命周期、依赖关系以及初始化行为由Spring容器控制。实例化Spring Bean的方式多种多样,包括XML配置、注解配置以及Java配置...

    Spring Bean 加载顺序 .

    Spring会分析Bean之间的依赖关系,通过@Autowired、@Qualifier等方式找到合适的依赖注入。在这个阶段,Spring会尝试解决依赖图,确保所有依赖都能被正确解决。 5. **Bean实例化**: 对于Singleton作用域的Bean,...

    spring bean的生命周期测试代码

    本资源提供了在Spring 4.2环境下关于Bean生命周期的测试代码,帮助我们深入理解这一关键概念。 首先,让我们了解Spring Bean的生命周期主要包含以下几个阶段: 1. **实例化**:Spring容器通过`Class`对象或`...

    Spring-注入依赖,AOP,自动注入Bean

    在Spring框架中,依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)是两大核心特性,同时自动注入Bean也是Spring管理对象的一种常见方式。让我们深入探讨这些概念。 首先,...

    Spring bean 管理

    Spring框架是Java企业级应用开发的事实标准,它通过依赖注入(DI)和面向切面编程(AOP)来...需要注意的是,无论是哪种方式,理解Spring Bean管理的原理和生命周期,对于开发高质量的Java企业级应用都是必不可少的。

    Spring Bean简单应用实例

    Spring通过IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)来管理这些Bean。在这个"Spring Bean简单应用实例"中,我们将深入理解这两个概念以及如何在实际应用中使用它们。 首先,...

    Spring的Bean配置

    Spring框架是Java开发中不可或缺的一部分,它以其控制反转(IoC)和依赖注入(DI)的核心特性,极大地简化了应用程序的构建与管理。在本文中,我们将深入探讨Spring中的Bean配置,包括IoC和DI的概念,Bean的配置方式...

    Spring实例化Bean顺序

    2. **依赖注入**:Spring容器会根据Bean之间的依赖关系来决定实例化顺序。如果一个Bean依赖于另一个Bean,那么被依赖的Bean会先被实例化。Spring使用“依赖倒置”的原则,使得控制权从对象内部转移到了外部的容器。 ...

    spring依赖注入底层详解

    2. AOP:Spring的AOP框架用于在运行时动态地修改程序的行为,比如在依赖注入时,AOP代理可以在目标对象的方法调用前后插入相应的行为,如检查依赖是否已注入,或者在注入过程中执行一些额外的操作。 此外,Spring还...

    谈谈我对Spring Bean 生命周期的理解

    Spring Bean 生命周期是 Spring 框架中的一个核心概念,掌握 Spring Bean 生命周期可以帮助我们更好地理解 Spring 框架的工作机制。通过本文,我们了解了 Spring Bean 生命周期的概念、生命周期图、生命周期阶段、...

    Spring bean生命周期demo

    如果Bean之间有依赖关系,Spring会先实例化并注入依赖的Bean。 4. **初始化回调** 初始化回调是在Bean实例化后,所有属性注入完成时执行的方法。Spring提供了`InitializingBean`接口的`afterPropertiesSet()`方法...

    spring的bean加载顺序样例项目

    - **依赖注入**:Spring首先处理Bean之间的依赖关系,根据`ref`属性或者@Autowired注解进行依赖注入。如果存在循环依赖,Spring会采用提前暴露的草案实例(Eager Initialization)来解决。 - **初始化方法**:...

    Spring Bean 的生命周期

    本篇将详细阐述Spring Bean生命周期的各个阶段,以及如何记忆和深入理解这一过程。 首先,Spring Bean的生命周期可以分为两个主要阶段:容器初始化阶段和容器销毁阶段。 在容器初始化阶段,Spring Bean会经历以下...

    java巩固练习Spring 的bean注入方式有几种demo例子

    首先,我们来了解Spring中的bean注入主要有以下四种方式: 1. **设值注入(Setter Injection)**:这是最常见的一种注入方式,通过setter方法来设置bean的属性。在XML配置文件中,我们可以通过`&lt;property&gt;`标签来...

Global site tag (gtag.js) - Google Analytics