FS1360472174 / javaweb

java learning
8 stars 4 forks source link

Basic Spring Knowledge #21

Open FS1360472174 opened 8 years ago

FS1360472174 commented 8 years ago

Spring 核心就是依赖注入与面向切面编程

依赖注入可以实现松耦合, 面向切面可以减少样板代码。

依赖注入 在A类里面调用B类。在A 类里面实现话B类,那么就会紧耦合。在测试时也不方便测试A类。 如果改用构造器注入,A类和B类松耦合。测试的时候,B类也可以通过Mock来实现。 将A与B的直接依赖变成对第三方组件的依赖。依赖关系被自动注入到需要的对象中

应用切面 将一些common 应用比于日志、事务、安全 与核心业务分离

FS1360472174 commented 8 years ago

容器 容器是spring 框架的核心。容器通过依赖注入管理构成应用的组件。

并不存在单一的组件,Spring 自带了几种容器实现。

Bean 工厂 org.springframework.beans.factory.BeanFactory

应用上下文 org.springframework.context.ApplicationContext 给予BeanFactory 构建。

FS1360472174 commented 8 years ago

\ 装配(wiring)** 创建对象之间的协作关系

Spring 容器提供了两种配置Bean的方式。

  1. 使用一个或多个XML文件来配置

2.Spring3.0 以后提供基于java 注解的配置方式

Bean的作用域默认的是单例。但是可以配置scope singleton,prototype,request,session,global-session/ prototype 一次调用就实例化一次。

之前提到过构造器注入。同样可以注入property.setter/getter 字段。

装配CreateName 类中的属性zk.

同样可以装配集合(Set,List,Map) properties

FS1360472174 commented 8 years ago

\ 动态装配属性 ** Spring 3 中引入了Spring 表达式语言(Spring Expression Language)SpEL runtime时装配

FS1360472174 commented 8 years ago

XML配置的自动装配主要有四种类型 1.byName 根据bean名字 2.byType 根据bean 类型 3.constructor 4.autodetect

从Spring2.5开始引入了注解自动装配。与XML中使用autowire属性自动装配并没有什么区别 Spring3 支持几种不同的用于自动装配的注解

  1. Spring自带的@Autowired 2.JSR-330 的@Inject 注解 3.JSR-250 的@Resource 注解
FS1360472174 commented 8 years ago

\ @Autowired ** 当没有Bean可以装配到@Autowired 所标注的属性或参数中,自动装配就会失败,抛出NoSuchBeanDefinitionException.

当然有时候属性不需要装配,null值也是可以接受的 @Autowired(required=false) private Person person;

\ 限定注解范围 ** 当有多个Bean都满足装配条件的时候,比如说接口有多个实现。这时候@Autowired 没法选择哪个Bean进行注解。就会抛出NoSuchBeanDefinitionException.明确表示装配失败。 可以通过@Qualifier来限定类型。

自定义限定类型 @Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Qualifier public @interface SuperMan{ }

**@Autowired 注解减少了Spring XML 配置,但是使用它的类引入了对Spring的特定依赖,即使这种依赖只是一个注解。

FS1360472174 commented 8 years ago

自动检测Bean context:component-scan元素除了完成与context:annotation-config一样的工作,还允许Spring自动检测Bean和定义Bean。 <context:component-scan base-package="com.fs"> /context:component-scan

会扫描base-package指定的包及其所有的子包,并查找出能够自动注册为Spring Bean的类。

查找需要注册的Bean 默认情况下,查找使用构造型标注的类 1.@Component 标示该类为Spring组件 2.@Controller 标示将该类定义为Spring MVC controller 3.@Repository 标识该类定义为数据仓库 4.@Service 标识该类定义为服务

FS1360472174 commented 8 years ago

java 配置类 一度spring的xml配置将讨厌xml的程序员挡在了spring的门外

XML的配置的根元素来自于Spring Bean命名空间的元素。 等价于基于JAVA配置里使用@Configuration 注解的类。

`@Bean public CassandraSessionFactoryBean session() throws Exception {

    CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();

    session.setCluster(cluster().getObject());
    session.setConverter(cassandraConverter());
    session.setKeyspaceName(getKeyspaceName());
    session.setSchemaAction(getSchemaAction());
    session.setStartupScripts(getStartupScripts());
    session.setShutdownScripts(getShutdownScripts());

    return session;
}`

通过使用@Bean注解标注的方法,会告知Spring我们希望该方法定义的Bean要被注册进Spring的应用上下文。因此,在其他Bean的声明方法中引用这个方法时,Spring都会拦截该方法的调用,并尝试在应用上下文中查找该Bean。而不是让方法创建一个新的实例

FS1360472174 commented 8 years ago

分布于应用中多处的功能被称为横切关注点(cross-cutting concerns)将这些与业务逻辑相分离就是面向切面(AOP)所要解决的问题。

切面:横切关注点可以被模块化为特殊的类,在这个类里面通过声明的方式定义这个功能以何种方式在何处调用。这些类被称为切面.切面是通知和切点的结合

通知(advice):切面的工作被定义为通知 Spring切面可以应用5中类型的通知 1.Before 方法调用前通知 2.After 3.After-returning 方法成功执行之后调用通知 4.After-throwing 方法抛出异常后调用通知 5.Around 通知包裹了被通知的方法。在被通知方法调用之前和调用之后执行自定义的行为。

连接点(JoinPoint) 应用可能对很多的时机应用通知。这些时机被称为连接点。 能够在程序执行过程中插入切面的一个点。

切点(PoinCut) 一个切面不需要通知应用的所有连接点。切点进行划分,缩写切面所通知连接点的范围。 切面定义了what,when.切点定义了where

引入(Introduction) 引入允许我们向现有的类添加新方法或属性

织入(Weaving) 将切面应用到目标对象来创建新的代理对象的过程。 在目标对象的生命周期里有多个点可以进行织入 编译qi: 类加载qi: 运行期:

FS1360472174 commented 8 years ago

AOP框架主要有三种 1.AspectJ 2.JBoss AOP 3.Spring AOP

Spring AOP Spring 通知是JAVA 编写。定义通知所应用的切点通常是Spring配置文件里的XML来配置的。

Spring在运行期通知对象 在代理类中包裹切面。Spring在运行期将切面织入到Spring管理的Bean中 代理类封装了目标类,并拦截被通知的方法的调用。再将调用转发给真正的目标Bean

Spring 只支持方法连接点。因为Spring AOP 是基于动态代理的。 AspectJ 和Jboss除了支持方法连接点,还支持字段和构造器接入点。