Java Spring的IoC和AOP的知识点速记

Spring简介

Spring解决的最核心的问题就是把对象之间的依赖关系转为用配置文件来管理,这个是通过Spring的依赖注入机制实现的。

Spring Bean装配

1. IOC的概念以及在Spring容器中如何进行IOC的操作。

IOC:Inversion of Control,控制反转。在Java开发中,IOC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制,这称为控制反转,就是被调用类的实例由原先的调用类控制创建、销毁现在转变成由Spring的容器管理。

2. Spring容器是如何管理Bean的生命周期的(如Bean的初始化方法,Bean的销毁方法)

创建:<bean name=”” class=”” 额外属性>

初始化:配置init­-method/实现接口InitializingBean

调用:context.getBean(),进行方法的调用

销毁:配置destroy-­method/实现DisposableBean接口

3. DI的概念以及在Spring框架注入有几种方式。使用构造注入对象,必须要注意什么问题?

注入方式:

构造注入[构造方法注入]

属性注入[属性的SET/GET]

方法注入[工厂注入]

<!-- 构造函数注入 -->
<bean id="user1" class="com.spring.test.model.User">
    <constructor-arg index="0" type="String" value="Lu"></constructor-arg>
    <constructor-arg index="1" type="String" value="123456"></constructor-arg>
</bean>

<!-- 属性注入 -->
<bean id="user2" class="com.spring.test.model.User">
    <property name="username" value="Luxx"></property>
    <property name="password" value="56789"></property>
</bean>

<!-- 工厂注入 -->
<bean id="userFactory" class="com.spring.test.factory.UserFactory"/>
<bean id="user3" factory-bean="userFactory" factory-method="createUser"></bean>

<!-- 静态工厂注入 -->
<bean id="user4" class="com.spring.test.factory.UserFactoryStatic" factory-method="createUser"></bean>

使用构造函数依赖注入时,Spring保证所有一个对象所有依赖的对象先实例化后,才实例化这个对象。使用set方法依赖注入时,Spring首先实例化对象,然后才实例化所有依赖的对象。

4. 使用DI注入时,Property代表什么意思,如果property引用的是其他Bean的话,如何注入,如果引用是字符串的话,如何设置。

使用DI注入时,Property代表注入类的属性,如果应用其他的bean用ref属性来表明被引用bean的名称,如果是引用字符串的话,用value属性。如:

<property name=”userDao” ref=”被引用bean的名称” />
<property name=”username” value = “字符串”/>

5. Bean的作用域

所有Spring Bean的默认都是单例,即scope=”singleton”

几种作用域:

singleton:在每一个Spring容器中,一个Bean定义只有一个对象实例。

prototype:Bean的定义可以被实例化任意次(每次调用都创建一个实例)。

request:在一次Http 请求中,每个Bean定义对应一个实例。该作用域仅在基于Web的Spring上下文(如Spring MVC)中才有效。

Session:在一个Http Session中,每个Bean定义对应一个实例。该作用域仅在基于Web的Spring上下文(如Spring MVC)中才有效。

Global-session:在一个全局Http Session中,每个Bean定义对应一个实例。该作用域仅在Portlet上下文中才有效。

6. DI自动装配(autowiring)

Spring中提供了自动装配依赖对象的机制,但是在实际应用中并不推荐使用自动装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。

自动装配是在配置文件中实现的,如下:

<bean id="***" class="***" autowire="byName">

只需要配置一个@Autowired属性即可完成自动装配,不用再配置文件中写<property>,但是在类中还是要生成依赖对象的setter方法。

Autowire的属性值有如下几个:

1)byName 按名称装配,可以根据属性的名称(或者ID)在容器中查询与该属性名称(或者ID)相同的bean,如果没有找到,则属性值为null;

2)byType 按类型装配,可以根据属性类型,在容器中寻找该类型匹配的bean,如有多个,则会抛出异常,如果没有找到,则属性值为null;如果有多个,使用bean的primary属性,注意:这个默认就是true,需要把非候选的bean的primary的属性设置为false。排除某些bean,设置某些bean的autowire-candidate属性为false。

3)constructor 与byType方式相似,不同之处在与它应用于构造器参数,如果在容器中没有找到与构造器参数类型一致的bean,那么将抛出异常;

4)autodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType的方式进行自动装配。首先尝试使用constructor 进行自动装配。如果失败,再尝试使用byType的方式。

可选的自动装配:默认情况下,@Autowired具有强契约特性,其所标注的属性或参数必须是可装配的,如果没有,则自动装配失败(抛出NoSuchBeanDefinitionException)。属性不一定要装配,null值也是可以接受的,使用@Autowired(required=false)来配置是可选的。

限定歧义性的依赖:使用@Qualifier(“bean id”),通过制定Bean的ID把选择范围缩小到只剩下一个Bean。

注意:显式的指定依赖,比如propertyconstructor-arg元素,总会覆盖自动装配。自动装配的行为可以和依赖检查结合使用,依赖检查会在自动装配完成后发生。

7. DI自动检测(autodiscovery)

配置Spring自动检测Bean的定义和自动装配Bean:

<context:component-scan base-package="com.spring.test"/>

默认情况下,<context:component-scan>查找使用构造型注解所标注的类,这些注解如下:

@Component 通用的构造型注解,标识该类为Spring组件。

@Controller 标识该类为Spring MVC controller。

@Repository 标识该类为数据仓库,一般作为DAO层的注解。

@Service 标识该类为服务,一般作为服务层的注解。

使用@Component标注的任意自定义注解。

Spring AOP

AOP的概念以及使用AOP机制有什么好处。

AOP的概念是Aspect Oriented Programming面向切面编程。

好处:AOP将程序分解成各个方面或者说关注点,这使得可以模块化,相当横向上分切了。它可以解决OOP和过程化方法不能够很好解决的横切(cross-cutting)问题,如:事务、安全、日志等横切关注。

Java Spring中实现AOP的2种方式:

1) 使用注解(@AspectJ)实现AOP:

@Aspect
@Component
public class LogAspect {
    @Before("execution(public * com.spring.test.service.*.*(..))")
    public void beforeService(){
        System.out.println("Before ...");
    }

    @After("execution(public * com.spring.test.service.*.*(..))")
    public void afterService(){
        System.out.println("After ...");
    }

    @AfterReturning("execution(public * com.spring.test.service.UserService.save(com.spring.test.model.User)) and args(user)")
    public void logAfterReturn(User user){
        System.out.println("After return..."+user);
    }
}

开启注解扫描:

xmlns:aop=http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd

<context:component-scan base-package="com.spring.test"/>
<aop:aspectj-autoproxy/>

2)另一种XML配置方式:

public class LogAspect {
    public void beforeService(){
        System.out.println("Before ...");
    }

    public void afterService(){
        System.out.println("After ...");
    }

    public void logAfterReturn(User user){
        System.out.println("After return..."+user);
    }
}

配置:

<bean id="logAspect" class="com.spring.test.aop.LogAspect" />
<aop:config>
<aop:aspectref="logAspect">
    <aop:pointcut id="serviceAction" expression="execution(public * com.spring.test.service.*.*(..))"/>
    <aop:beforepointcut-ref="serviceAction" method="beforeService"/>
    <aop:afterpointcut-ref="serviceAction" method="afterService"/>

    <aop:pointcutid="serviceReturnAction"
    expression="execution(public * com.spring.test.service.UserService.save(com.spring.test.model.User)) and args(user)"/>
    <aop:after-returningpointcut-ref="serviceReturnAction" method="logAfterReturn" arg-names="user"/>
</aop:aspect>
</aop:config>

参考:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/index.html

http://oss.org.cn/ossdocs/framework/spring/zh-cn/beans.html

时间: 2024-12-29 09:32:45

Java Spring的IoC和AOP的知识点速记的相关文章

spring的IOC和AOP详细讲解

1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是有这个IOC容器进行产生,同时,要是产生的是单例的bean,他还可以给管理bean的生命周期! spring的IOC有三种注入方式 : 第一是根据属性注入 也叫set方法注入: 第二种是根据构造方法进行注入: 第三种是根据注解进行注入,这种方式我认为比较好,方便,要是bean多的话,使用前两种方式会使得配置文件过于臃肿. Spri

Spring 的IOC 和Aop

Spring 的IOC 和Aop 在ApplicationContext.xml中,bean的scope属性默认是singleton,即默认是单例 Spring容器创建的时候,会将所有的配置的bean对象创建,默认bean都是单例的, 代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构造器,创建实例对象 bean的作用域 scope=“prototype” 原型模型(N个对象),真正使用时才会创建,没获取一次,都会创建不同的对象 scopr="singl

Spring入门IOC和AOP学习笔记

Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容器中Bean之间的依赖关系,使用一种叫做"依赖注入"的方式来管理bean之间的依赖关系. Spring有两个核心接口:BeanFactory和ApplicationContext,ApplicationContext是BeanFactory的子接口.它们都可以代表Spring容器,Spri

Spring的IOC和AOP之深剖

我们首先要知道 用Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例,并调用bean实例的方法完成“依赖注入”. Spring框架的作用是什么?有什么优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6

Spring中IOC和AOP的详细解释

我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC就是典型的工厂模式,通过sessionfactory去注入实例. AOP就是典型的代理模式的体现. 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对

spring的IOC和AOP

spring的核心就是IOC和AOP. IOC(控制反转)和DI(依赖注入)是同一个概念.具体的讲:当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例.但在spring中 创建被调用者的工作不再由调用者来完成,因此称为控制反转.创建被调用者的工作由spring来完成,然后注入调用者因此也称为依赖注入.所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B.举个生活中的例子:通常情况下,假如你有一天在家里口渴了

spring的IOC和AOP协同工作

看网络上的spring资料,基本都是在讲解IOC和AOP,但是二者是如何协同工作的,说的很少. 粗略调试了下BeanFactory的创建过程,发现是如图所示的大概过程.其中BeanPostProcessor是关键. 在目标对象实例化完成后,通过AOP相关的BeanPostProcessor,检查实例是否需要增加AOP,需要的话,就按照网络中大多数资料中讲解的流程,创建代理实例,并将代理实例,增加到缓存中,这样再次获取指定Bean时,就会获得已增加AOP的代理实例. 如果有错误之处,还请指出.

SSH整合 第四篇 Spring的IoC和AOP

这篇主要是在整合Hibernate后,测试IoC和AOP的应用. 1.工程目录(SRC) 2.IoC 1).一个Service测试类 1 /* 2 * 加入spring容器 3 */ 4 private ApplicationContext applicationContext = 5 6 new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); 7 public static void

对Spring中IOC和AOP的理解

IOC:控制反转也叫依赖注入.利用了工厂模式. 为了方便理解,分解成每条以便记忆.  1.将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象.2.在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,3.在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面ne