spring

Posted yan束子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring相关的知识,希望对你有一定的参考价值。

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法。

    通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理。

    Spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过Spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。

    依赖注入的另一种说法是"控制反转"。通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员。

    而控制反转是指new实例工作不由我们程序员来做而是交给Spring容器来做。

2. Spring中的设计模式(2017-11-13-lyq)

a. 单例模式——spring中两种代理方式,若目标对象实现了若干接口,spring使用jdk的java.lang.reflect.Proxy类代理。若目标兑现没有实现任何接口,spring使用CGLIB库生成目标类的子类。

单例模式——在spring的配置文件中设置bean默认为单例模式。

b. 模板方式模式——用来解决代码重复的问题。

比如:RestTemplate、JmsTemplate、JpaTemplate

d.前端控制器模式——spring提供了前端控制器DispatherServlet来对请求进行分发。

e.试图帮助(view helper)——spring提供了一系列的JSP标签,高效宏来帮助将分散的代码整合在试图中。

f.依赖注入——贯穿于BeanFactory/ApplacationContext接口的核心理念。

g.工厂模式——在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用同一个接口来指向新创建的对象。Spring中使用beanFactory来创建对象的实例。

3. Spring的常用注解(2017-11-13-lyq)

  Spring在2.5版本以后开始支持注解的方式来配置依赖注入。可以用注解的方式来代替xml中bean的描述。注解注入将会被容器在XML注入之前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果。

注解装配在spring中默认是关闭的。所以需要在spring的核心配置文件中配置一下才能使用基于注解的装配模式。配置方式如下:

<context:annotation-config />

常用的注解:

@Required:该注解应用于设值方法

@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。

@Qualifier:该注解和@Autowired搭配使用,用于消除特定bean自动装配的歧义。

4. 简单介绍一下Spring bean的生命周期

bean定义:在配置文件里面用<bean></bean>来进行定义。

bean初始化:有两种方式初始化:

1.在配置文件中通过指定init-method属性来完成

2.实现org.springframwork.beans.factory.InitializingBean接口

bean调用:有三种方式可以得到bean实例,并进行调用

bean销毁:销毁有两种方式

1.使用配置文件指定的destroy-method属性

2.实现org.springframwork.bean.factory.DisposeableBean接口

5、Spring结构图

 

 

(1)核心容器:包括Core、Beans、Context、EL模块。

Core模块:封装了框架依赖的最底层部分,包括资源访问、类型转换及一些常用工具类。

Beans模块:提供了框架的基础部分,包括反转控制和依赖注入。其中Bean Factory是容器核心,本质是“工厂设计模式”的实现,而且无需编程实现“单例设计模式”,单例完全由容器控制,而且提倡面向接口编程,而非面向实现编程;所有应用程序对象及对象间关系由框架管理,从而真正把你从程序逻辑中把维护对象之间的依赖关系提取出来,所有这些依赖关系都由BeanFactory来维护。

Context模块:以Core和Beans为基础,集成Beans模块功能并添加资源绑定、数据验证、国际化、Java EE支持、容器生命周期、事件传播等;核心接口是ApplicationContext。

EL模块:提供强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring 容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。

(2)AOP、Aspects模块:

AOP模块:Spring AOP模块提供了符合AOP Alliance规范的面向方面的编程(aspect-oriented programming)实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中;这样各专其职,降低业务逻辑和通用功能的耦合。

Aspects模块:提供了对AspectJ的集成,AspectJ提供了比Spring ASP更强大的功能。

数据访问/集成模块:该模块包括了JDBC、ORM、OXM、JMS和事务管理。

事务模块:该模块用于Spring管理事务,只要是Spring管理对象都能得到Spring管理事务的好处,无需在代码中进行事务控制了,而且支持编程和声明性的事务管理。

JDBC模块:提供了一个JBDC的样例模板,使用这些模板能消除传统冗长的JDBC编码还有必须的事务控制,而且能享受到Spring管理事务的好处。

ORM模块:提供与流行的“对象-关系”映射框架的无缝集成,包括Hibernate、JPA、MyBatis等。而且可以使用Spring事务管理,无需额外控制事务。

OXM模块:提供了一个对Object/XML映射实现,将java对象映射成XML数据,或者将XML数据映射成java对象,Object/XML映射实现包括JAXB、Castor、XMLBeans和XStream。

JMS模块:用于JMS(Java Messaging Service),提供一套“消息生产者、消息消费者”模板用于更加简单的使用JMS,JMS用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

Web/Remoting模块:Web/Remoting模块包含了Web、Web-Servlet、Web-Struts、Web-Porlet模块。

Web模块:提供了基础的web功能。例如多文件上传、集成IoC容器、远程过程访问(RMI、Hessian、Burlap)以及Web Service支持,并提供一个RestTemplate类来提供方便的Restful services访问。

Web-Servlet模块:提供了一个Spring MVC Web框架实现。Spring MVC框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的JSP标签,完全无缝与Spring其他技术协作。

Web-Struts模块:提供了与Struts无缝集成,Struts1.x 和Struts2.x都支持

Test模块:Spring支持Junit和TestNG测试框架,而且还额外提供了一些基于Spring的测试功能,比如在测试Web框架时,模拟Http请求的功能。

7、Spring能帮我们做什么?

         a. Spring能帮我们根据配置文件创建及组装对象之间的依赖关系。

Spring根据配置文件来进行创建及组装对象间依赖关系,只需要改配置文件即可

         b. Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。

 

Spring 面向切面编程能提供一种更好的方式来完成,一般通过配置方式,而且不需要在现有代码中添加任何额外代码,现有代码专注业务逻辑。

         c. Spring能非常简单的帮我们管理数据库事务。

 

采用Spring,我们只需获取连接,执行SQL,其他事物相关的都交给Spring来管理了。

         d. Spring还能与第三方数据库访问框架(如Hibernate、JPA)无缝集成,而且自己也提供了一套JDBC访问模板,来方便数据库访问。

         e. Spring还能与第三方Web(如Struts、JSF)框架无缝集成,而且自己也提供了一套Spring MVC框架,来方便web层搭建。

         f. Spring能方便的与Java EE(如Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)。

7. 请描述一下Spring的事务(2017-11-22-lyq)

声明式事务管理的定义:用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可,这样维护起来极其方便。

基于TransactionInterceptor 的声明式事务管理:两个次要的属性:transactionManager,用来指定一个事务治理器,并将具体事务相关的操作请托给它;其他一个是Properties 类型的transactionAttributes 属性,该属性的每一个键值对中,键指定的是方法名,方法名可以行使通配符,而值就是表现呼应方法的所运用的事务属性。

1. <beans...>

2. ......

3. <bean id="transactionInterceptor"

4. class="org.springframework.transaction.interceptor.TransactionInterceptor">

5. <property name="transactionManager" ref="transactionManager"/>

6. <property name="transactionAttributes">

7. <props>

8. <prop key="transfer">PROPAGATION_REQUIRED</prop>

9. </props>

10. </property>

11. </bean>

12. <bean id="bankServiceTarget"

13. class="footmark.spring.core.tx.declare.origin.BankServiceImpl">

14. <property name="bankDao" ref="bankDao"/>

15. </bean>

16. <bean id="bankService"

17. class="org.springframework.aop.framework.ProxyFactoryBean">

18. <property name="target" ref="bankServiceTarget"/>

19. <property name="interceptorNames">

20. <list>

21. <idref bean="transactionInterceptor"/>

22. </list>

23. </property>

24. </bean>

25. ......

26. </beans>

 

基于TransactionProxyFactoryBean 的声明式事务管理:设置配置文件与先前比照简化了许多。我们把这类设置配置文件格式称为Spring 经典的声明式事务治理

1. <beans......>

2. ......

3. <bean id="bankServiceTarget"

4. class="footmark.spring.core.tx.declare.classic.BankServiceImpl">

5. <property name="bankDao" ref="bankDao"/>

6. </bean>

7. <bean id="bankService"

8. class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

9. <property name="target" ref="bankServiceTarget"/>

10. <property name="transactionManager" ref="transactionManager"/>

11. <property name="transactionAttributes">

12. <props>

13. <prop key="transfer">PROPAGATION_REQUIRED</prop>

14. </props>

15. </property>

16. </bean>

17. ......

18. </beans></beans>

 

基于<tx> 命名空间的声明式事务治理:在前两种方法的基础上,Spring 2.x 引入了<tx> 命名空间,连络行使<aop> 命名空间,带给开发人员设置配备声明式事务的全新体验。

1. <beans......>

2. ......

3. <bean id="bankService"

4. class="footmark.spring.core.tx.declare.namespace.BankServiceImpl">

5. <property name="bankDao" ref="bankDao"/>

6. </bean>

7. <tx:adviceid="bankAdvice" transaction-manager="transactionManager">

8. <tx:attributes>

9. <tx:method name="transfer" propagation="REQUIRED"/>

10. </tx:attributes>

11. </tx:advice>

12.

13. <aop:config>

14. <aop:pointcut id="bankPointcut" expression="execution(* *.transfer(..))"/>

15. <aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/>

感恩于心,回报于行。 面试宝典系列-Java

http://www.itheima.com Copyright© 2018 黑马程序员

397

 

 

16. </aop:config>

17. ......

18. </beans>

 

基于@Transactional 的声明式事务管理:Spring 2.x 还引入了基于Annotation 的体式格式,具体次要触及@Transactional 标注。@Transactional 可以浸染于接口、接口方法、类和类方法上。算作用于类上时,该类的一切public 方法将都具有该类型的事务属性。

1. @Transactional(propagation = Propagation.REQUIRED)

2. public boolean transfer(Long fromId,Long toId,double amount) {

3. return bankDao.transfer(fromId,toId,amount);

4. }

 

编程式事物管理的定义:在代码中显式挪用beginTransaction()、commit()、rollback()等事务治理相关的方法,这就是编程式事务管理。Spring对事物的编程式管理有基于底层API的编程式管理和基于TransactionTemplate 的编程式事务管理两种方式。

基于底层API的编程式管理:凭证PlatformTransactionManager、TransactionDefinition 和TransactionStatus 三个焦点接口,来实现编程式事务管理。

5. Public class BankServiceImpl implements BancService{

6. Private BanckDao bankDao;

7. private TransactionDefinition txDefinition;

8. private PlatformTransactionManager txManager;

9. ......

10. public boolean transfer(Long fromId,Long toId,double amount) {

11. TransactionStatus txStatus = txManager.getTransaction(txDefinition);

12. boolean result = false;

13. try {

14. result = bankDao.transfer(fromId,toId,amount);

15. txManager.commit(txStatus);

16. } catch (Exception e) {

17. result = false;

18. txManager.rollback(txStatus);

19. System.out.println("Transfer Error!");

20. }

21. return result;

22. }

 

 

 

23. }

 

9.基于TransactionTemplate 的编程式事务管理:为了不损坏代码原有的条理性,避免出现每一个方法中都包括相同的启动事物、提交、回滚事物样板代码的现象,spring提供了transactionTemplate模板来实现编程式事务管理。

1. public class BankServiceImpl implements BankService {

2. private BankDao bankDao;

3. private TransactionTemplate transactionTemplate;

4. ......

5. public boolean transfer(final Long fromId,final Long toId,final double amount) {

6. return (Boolean) transactionTemplate.execute(new TransactionCallback(){

7. public Object doInTransaction(TransactionStatus status) {

8. Object result;

9. try {

10. result = bankDao.transfer(fromId,toId,amount);

11. } catch (Exception e) {

12. status.setRollbackOnly();

13. result = false;

14. System.out.println("Transfer Error!");

15. }

16. return result;

17. }

18. });

19. }

20. }

 

7.编程式事务与声明式事务的区别:

1)编程式事务是自己写事务处理的类,然后调用

2)声明式事务是在配置文件中配置,一般搭配在框架里面使用!

8. BeanFactory常用的实现类有哪些?

Bean工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。常用的BeanFactory实现有DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。

XMLBeanFactory,最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory,它根据XML文件中

的定义加载beans。该容器从XML文件读取配置元数据并用它去创建一个完全配置的系统或应用。

9. 解释Spring JDBC、Spring DAO和Spring ORM(2017-12-03-gxb)

Spring-DAO 并非Spring 的一个模块,它实际上是指示你写DAO 操作、写好DAO 操作的一些规范。因此,对于访问你的数据它既没有提供接口也没有提供实现更没有提供模板。在写一个DAO 的时候,你应该使用@Repository对其进行注解,这样底层技术(JDBC,Hibernate,JPA,等等)的相关异常才能一致性地翻译为相应的DataAccessException子类。

Spring-JDBC 提供了Jdbc 模板类,它移除了连接代码以帮你专注于SQL 查询和相关参数。Spring-JDBC 还提供了一个JdbcDaoSupport,这样你可以对你的DAO 进行扩展开发。它主要定义了两个属性:一个DataSource 和一个JdbcTemplate,它们都可以用来实现DAO 方法。JdbcDaoSupport 还提供了一个将SQL 异常转换为Spring DataAccessExceptions 的异常翻译器。

Spring-ORM 是一个囊括了很多持久层技术(JPA,JDO,Hibernate,iBatis)的总括模块。对于这些技术中的每一个,Spring 都提供了集成类,这样每一种技术都能够在遵循Spring 的配置原则下进行使用,并平稳地和Spring 事务管理进行集成。

对于每一种技术,配置主要在于将一个DataSource bean 注入到某种SessionFactory或者EntityManagerFactory等bean 中。纯JDBC 不需要这样的一个集成类(JdbcTemplate 除外),因为JDBC 仅依赖于一个DataSource。

如果你计划使用一种ORM 技术,比如JPA 或者Hibernate,那么你就不需要Spring-JDBC 模块了,你需要的是这个Spring-ORM 模块。

10. 简单介绍一下Spring WEB模块。(2017-12-03-gxb)

Spring的WEB模块是构建在applicationcontext模块基础之上,提供一个适合web应用的上下文。这个模块也包括支持多种面向web的任务,如透明地处理多个文件上传请求和程序级请求参数的绑定到你的业务对象。它也有对JakartaStruts的支持。

11. Spring配置文件有什么作用?(2017-12-03-gxb)

Spring配置文件是个XML文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。

12. 什么是SpringIOC容器?(2017-12-03-gxb)

IOC 控制反转:SpringIOC负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。

14. ApplicationContext的实现类有哪些?(2017-12-03-gxb)

FileSystemXmlApplicationContext:此容器从一个XML文件中加载beans的定义,XMLBean配置文件的全路径名必须提供给它的构造函数。

ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。

WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。

15. BeanFactory与AppliacationContext有什么区别(2017-12-03-gxb)

1. BeanFactory

基础类型的IOC容器,提供完成的IOC服务支持。如果没有特殊指定,默认采用延迟初始化策略。相对来说,容器启动初期速度较快,所需资源有限。

2.ApplicationContext

ApplicationContext是在BeanFactory的基础上构建,是相对比较高级的容器实现,除了BeanFactory的所有支持外,ApplicationContext还提供了事件发布、国际化支持等功能。ApplicationContext管理的对象,在容器启动后默认全部初始化并且绑定完成。

16. 什么是Spring的依赖注入?(2017-12-04-gxb)

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。

17. 有哪些不同类型的IOC(依赖注入)方式?(2017-12-04-gxb)

Spring提供了多种依赖注入的方式。

1.Set注入

2.构造器注入

3.静态工厂的方法注入

4.实例工厂的方法注入

18. 什么是Springbeans?(2017-12-04-gxb)

Springbeans是那些形成Spring应用的主干的java对象。它们被SpringIOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中<bean/>的形式定义。

Spring框架定义的beans都是单例beans。

19. 一个SpringBeans的定义需要包含什么?(2017-12-04-gxb)

一个SpringBean的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。

20. 你怎样定义类的作用域?(2017-12-04-gxb)

当定义一个<bean>在Spring里,我们还能给这个bean声明一个作用域。它可以通过bean定义中的scope属性来定义。如,当Spring要在需要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。另一方面,一个bean每次使用的时候必须返回同一个实例,这个bean的scope属性必须设为singleton。

21. Spring支持的几种bean的作用域。(2017-12-04-gxb)

Spring框架支持以下五种bean的作用域:

singleton:bean在每个Springioc容器中只有一个实例。

prototype:一个bean的定义可以有多个实例。

request:每次http请求都会创建一个bean,该作用域仅在基于web的SpringApplicationContext情形下有效。

session:在一个HTTPSession中,一个bean定义对应一个实例。该作用域仅在基于web的SpringApplicationContext情形下有效。

global-session:在一个全局的HTTPSession中,一个bean定义对应一个实例。该作用域仅在基于web的SpringApplicationContext情形下有效。

缺省的Springbean的作用域是Singleton。

22. Spring框架中的单例bean是线程安全的吗?(2017-12-04-gxb)

Spring框架中的单例bean不是线程安全的。

23. 什么是Spring的内部bean?(2017-12-04-gxb)

当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义innerbean,在Spring的基于XML的配置元数据中,可以在<property/>或<constructor-arg/>元素内使用<bean/>元素,内部bean通常是匿名的,它们的Scope一般是prototype。

24. 在Spring中如何注入一个java集合?(2017-12-04-gxb)

Spring提供以下几种集合的配置元素:

<list>类型用于注入一列值,允许有相同的值。

<set>类型用于注入一组值,不允许有相同的值。

<map>类型用于注入一组键值对,键和值都可以为任意类型。

<props>类型用于注入一组键值对,键和值都只能为String类型。

25. 什么是bean的自动装配?(2017-12-04-gxb)

无须在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>、<constructor-arg>)。IOC容器会自动建立javabean之间的关联关系。

26. 解释不同方式的自动装配。(2017-12-04-gxb)

有五种自动装配的方式,可以用来指导Spring容器用自动装配方式来进行依赖注入。

1)no:默认的方式是不进行自动装配,通过显式设置ref属性来进行装配。

2)byName:通过参数名自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。

3)byType::通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。

4)constructor:这个方式类似于byType,但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。

5)autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。

27. 什么是基于Java的Spring注解配置?给一些注解的例子

基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件。

以@Configuration注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。

28. 什么是基于注解的容器配置?

相对于XML文件,注解型的配置依赖于通过字节码元数据装配组件,而非尖括号的声明。开发者通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用xml表述bean的装配关系。

29. 怎样开启注解装配?(2017-12-05-gxb)

注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置<context:annotation-config/>元素。

30. 在Spring框架中如何更有效地使用JDBC?(2017-12-05-gxb)

使用SpringJDBC框架,资源管理和错误处理的代价都会被减轻。所以开发者只需写statements和queries从数据存取数据,JDBC也可以在Spring框架提供的模板类的帮助下更有效地被使用,这个模板叫JdbcTemplate。

JdbcTemplate类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处理。

31. 使用Spring通过什么方式访问Hibernate?(2017-12-05-gxb)

在Spring中有两种方式访问Hibernate:

1)控制反转HibernateTemplate和Callback。

2)继承HibernateDAOSupport提供一个AOP拦截器。

32. Spring支持的ORM框架有哪些?(2017-12-05-gxb)

Spring支持以下ORM:

Hibernate、iBatis、JPA(JavaPersistenceAPI)、TopLink、JDO(JavaDataObjects)、OJB

33. 简单解释一下spring的AOP(2017-12-05-gxb)

AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可

维护性。

使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在SpringAOP中,切面通过带有@Aspect注解的类实现。

34. 在SpringAOP中,关注点和横切关注的区别是什么?

关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

35. 什么是连接点?(2017-12-05-gxb)

被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。

36. Spring的通知是什么?有哪几种类型?(2017-12-05-gxb)

通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。

Spring切面可以应用五种类型的通知:

1)before:前置通知,在一个方法执行前被调用。

2)after:在方法执行之后调用的通知,无论方法执行是否成功。感恩于心,回报于行。

以上是关于spring的主要内容,如果未能解决你的问题,请参考以下文章

Springspring事务失效的12种场景

SpringSpring MVCMyBatis

SpringSpring Data JPA

SpringSpring系列4之Spring支持JDBC

SpringSpring底层核心原理解析

SpringSpring 网络原因导致日志下载失败