Open FS1360472174 opened 8 years ago
容器 容器是spring 框架的核心。容器通过依赖注入管理构成应用的组件。
并不存在单一的组件,Spring 自带了几种容器实现。
Bean 工厂 org.springframework.beans.factory.BeanFactory
应用上下文 org.springframework.context.ApplicationContext 给予BeanFactory 构建。
\ 装配(wiring)** 创建对象之间的协作关系
Spring 容器提供了两种配置Bean的方式。
2.Spring3.0 以后提供基于java 注解的配置方式
Bean的作用域默认的是单例。但是可以配置scope singleton,prototype,request,session,global-session/ prototype 一次调用就实例化一次。
之前提到过构造器注入。同样可以注入property.setter/getter 字段。
装配CreateName 类中的属性zk.
同样可以装配集合(Set,List,Map) properties
\ 动态装配属性 ** Spring 3 中引入了Spring 表达式语言(Spring Expression Language)SpEL runtime时装配
XML配置的自动装配主要有四种类型 1.byName 根据bean名字 2.byType 根据bean 类型 3.constructor 4.autodetect
从Spring2.5开始引入了注解自动装配。与XML中使用autowire属性自动装配并没有什么区别 Spring3 支持几种不同的用于自动装配的注解
\ @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的特定依赖,即使这种依赖只是一个注解。
自动检测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 标识该类定义为服务
java 配置类 一度spring的xml配置将讨厌xml的程序员挡在了spring的门外
XML的配置的根元素来自于Spring Bean命名空间的
`@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。而不是让方法创建一个新的实例
分布于应用中多处的功能被称为横切关注点(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: 运行期:
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除了支持方法连接点,还支持字段和构造器接入点。
Spring 核心就是依赖注入与面向切面编程
依赖注入可以实现松耦合, 面向切面可以减少样板代码。
依赖注入 在A类里面调用B类。在A 类里面实现话B类,那么就会紧耦合。在测试时也不方便测试A类。 如果改用构造器注入,A类和B类松耦合。测试的时候,B类也可以通过Mock来实现。 将A与B的直接依赖变成对第三方组件的依赖。依赖关系被自动注入到需要的对象中
应用切面 将一些common 应用比于日志、事务、安全 与核心业务分离