- IOC/DI
IOC控制反转,不是什么技术,而是一种设计模式,是传统创建对象的主动变被动,传统方式想要获得一个新对象需要new或者查JNDI,而IOC容器方式转变为需要一个新对象在运行时给你动态注入。
DI依赖注入,和IOC其实是同样的概念,IOC可能再概念上解释的有点让人迷糊,但是依赖注入可以让人很清楚的明白,它要干的事就是为你需要对象的地方按照某种依赖关系为你注入。他是怎么实现注入的?根据jdk自带的反射特性进行注入。使用IOC的目的主要是解除高耦合。 - 装配bean
Spring自动装配autowrite,提供了三种配置bean的方式如下:
1.xml方式装配bean 。
2.javaConfig方式装配bean 需要在类上使用注解@configuration,在装载的bean上使用@bean注解。
3.隐式bean发现机制和自动化装配需要在需要变成bean的类上加@component,另外我们需要配置一个扫描类@ComponentScan注解,或者在xml中添加自动扫描。 - Java反射
Java反射是指在运行时获取一个类的全部,java反射和Class类离不开,Class类有一个私有构造函数,它只能有jvm创建,但是我们可以有四种方式获取,1.使用每个类的getClass来获取;2.使用每个类的getSuperclass来获取基类Class;3.使用Class.forName(“”);4.使用包装类的TYPE。我们通过这个Class最终使用反射API可以操作一个类。 - Spring AOP
Aop为切面编程,spring采用的是字节码方式的,切面编程主要是服务于日志处理,权限控制,性能监控,事务控制,等功能,它通过配置通知完成增强内容,通过配置切面连接点设置代理的目标对象。使用@Aspect定义切面类,使用@Pointcut定义切点,使用@before等注解配置方法内容,定义切点使用execution(modifiers-pattern? return-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern)去匹配,其中modifiers-pattern 修饰符 比如public private这种(可以指定可以不指定)return-type-pattern 返回值类型(必须指定)declaring-type-pattern 类型(可以是含包名的全路径类型 可以指定可以不指定)name-pattern 方法名(必须指定)param-pattern 参数类型(必须指定)。 - Spring 容器
Spring有多个容器设置,可以归为两类,1.bean工厂、2.应用上下文,其中应用上下文主要有下面几种定义,1AnnotationConfigApplicationContext基于Java的配置类加载spring应用上下文,2. AnnotationConfigWebApplicationContext基于java的配置类加载springweb应用上下文,3. ClassPathXmlApplicationContext基于类路径的xml配置文件加载上下文,4. FileSystemXmlapplicationcontext基于文件路径的xml配置文件加载spring应用上下文,5. XmlWebApplicationContext从web应用上的xml配置文件加载应用上下文。 - bean 生命周期
1.spring对bean实例化
2.spring将值和bean的引用注入到bean对应的属性中
3.如果实现了BeanNameAwarej接口将bean ID传递给setBeanName方法
4.如果实现了BeanFactoryAware接口将BeanFactory容器实例传入setBeanFactory方法
5.如果实现了ApplicationContextAware接口将bean所在应用上下文传入setApplicationContext方法
6.如果实现了BeanPostProcessor接口,将调用其postProcessBeforeInitialization方法
7.如果实现了InitializingBean接口,将调用其afterPropertiesSet方法,如果使用initmethod声明了初始化方法,则该方法会被调用
8.如果实现了BeanPostProcessor接口,将调用其postProcessAfterInitialization方法
9.Bean创建完成
10.如果实现了DisposableBean接口,将调用其destroy方法,如果使用destroymethod声明了销毁方法,该方法也会被调用。
- Bean的高级配置
使用@Profile()注解可以在@Bean方式装载的bean上实现按照环境变量控制是否装载该bean,常用在测试和生产datebase bean的装配上,只有在profile激活时才会创建,而profile的激活有两个属性spring.profiles.default和spring.profiles.active,后者优先级高完成的是同样的事情。设置这两个属性可以有下面的几个方法:
1.作为dispatcherservlet的初始化参数。
2.作为web应用的上下文参数。
3.作为jndi条目。
4.作为环境变量。
5.作为jvm的系统属性。
6.在测试类上,使用@ActiveProfiles注解设置。
使用条件化@Conditional注解可以在@Bean方式转载的bean上实现条件化的控制是否装载该bean,@Conditional的条件是实现了Condition接口的类,该类需要实现matches方法,该方法中有两个参数ConditionContext接口变量,AnnotatedTypeMetadata接口变量。 - 自定义注解
自定义注解使用@interface关键字,例如下面的自定义@Cold注解:
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@-------(引用的注解)
Public @interface Cold{} - 自动装配bean时歧义性处理
当自动装配bean遇到歧义时,我们可以在@Bean或者@Component加载的bean上添加首先标志@Primary,或者可以@Autowirde自动装载时添加上限定符@Qualifier(),其参数是需要注入的bean的id,但是如果你想要在配置bean的时候限定死一个id的化,可以在@bean、@Component配置的bean上加上@Qualifier。 - Bean的作用域设置
我们可以通过@Scope注解声明bean的作用域,默认为单例,我们采用ConfigurableBeanFactory类的SCOPE_…样类型安全点,单例:Singleton,原型:Prototype,会话:Session,请求:Rquest。但是作为会话作用域,我们不能只加上@Scope注解,因为存在被注解的类作用域不同步情况,我们可以为其添加proxyMode代理,同样可以使用ScpedProxyMode类的常量,如果该bean是个接口我们可以INTERFACES,如果是个实现类我们用TARGET_CLASS - 运行时值注入
Spring提供了两种值注入,1使用属性占位符,声明属性源@PropertySource注解,该注解用于加载配置文件到Environment实体,但是如果我们使用自动装配bean时,我们可以用@Value注解如@Value(“${a.cc}“),但是想要使用@Value必须有PropertySourcesPlaceholderConfigurer,bean,所以需要使用javaconfig配置该bean。
2.使用表达式语言进行值注入需要放在#{。。。。}中同样如果是自动装配bean时我们使用@Value - Spring AOP
AOP有通知、切点、连接点等,切面定义通知,通知是应用切面的处理动作,连接点是可以应用通知的所有可能点,切点是应用切面的一起连接点集合。我们可以使用@AspectJ注解来定义切面,使用@Before、@AfterReturning、@AfterThrowing、@After、@Around等注解定义通知,也可以通过@Pointcut注解声明切点,我们使用spring支持得指示器来限制连接点。常用得指示器有execution等,当然,我们需要在配置文件上加@EnableAspectJAutoProxy启用AspectJ自动代理,同时我们得重点说下@Around通知,它会传入一个参数ProceedingJoinPoint,类我们使用try catch来触发异常通知,在try方法内,我们用该参数得proceed方法来分割前置,和后置通知,proceed方法如果不调用就会阻塞被通知方法得调用,也可以多次调用proceed方法进行多次重试。各种通知可选参数有JoinPoint。使用下面的代码可以为切点类添加新方法:
@Aspect
Public class EncoreableIntroducer{
@DeclaceParents(value=”concert.Performance+”,
defaultImpl =DefaultEncoreable.class)
Public static Encoreable encoreable;
}
spring框架相关问题
最新推荐文章于 2024-08-01 22:00:59 发布