spring框架相关问题

  1. IOC/DI
    IOC控制反转,不是什么技术,而是一种设计模式,是传统创建对象的主动变被动,传统方式想要获得一个新对象需要new或者查JNDI,而IOC容器方式转变为需要一个新对象在运行时给你动态注入。
    DI依赖注入,和IOC其实是同样的概念,IOC可能再概念上解释的有点让人迷糊,但是依赖注入可以让人很清楚的明白,它要干的事就是为你需要对象的地方按照某种依赖关系为你注入。他是怎么实现注入的?根据jdk自带的反射特性进行注入。使用IOC的目的主要是解除高耦合。
  2. 装配bean
    Spring自动装配autowrite,提供了三种配置bean的方式如下:
    1.xml方式装配bean 。
    2.javaConfig方式装配bean 需要在类上使用注解@configuration,在装载的bean上使用@bean注解。
    3.隐式bean发现机制和自动化装配需要在需要变成bean的类上加@component,另外我们需要配置一个扫描类@ComponentScan注解,或者在xml中添加自动扫描。
  3. Java反射
    Java反射是指在运行时获取一个类的全部,java反射和Class类离不开,Class类有一个私有构造函数,它只能有jvm创建,但是我们可以有四种方式获取,1.使用每个类的getClass来获取;2.使用每个类的getSuperclass来获取基类Class;3.使用Class.forName(“”);4.使用包装类的TYPE。我们通过这个Class最终使用反射API可以操作一个类。
  4. 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 参数类型(必须指定)。
  5. Spring 容器
    Spring有多个容器设置,可以归为两类,1.bean工厂、2.应用上下文,其中应用上下文主要有下面几种定义,1AnnotationConfigApplicationContext基于Java的配置类加载spring应用上下文,2. AnnotationConfigWebApplicationContext基于java的配置类加载springweb应用上下文,3. ClassPathXmlApplicationContext基于类路径的xml配置文件加载上下文,4. FileSystemXmlapplicationcontext基于文件路径的xml配置文件加载spring应用上下文,5. XmlWebApplicationContext从web应用上的xml配置文件加载应用上下文。
  6. 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生命周期
  7. 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接口变量。
  8. 自定义注解
    自定义注解使用@interface关键字,例如下面的自定义@Cold注解:
    @Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @-------(引用的注解)
    Public @interface Cold{}
  9. 自动装配bean时歧义性处理
    当自动装配bean遇到歧义时,我们可以在@Bean或者@Component加载的bean上添加首先标志@Primary,或者可以@Autowirde自动装载时添加上限定符@Qualifier(),其参数是需要注入的bean的id,但是如果你想要在配置bean的时候限定死一个id的化,可以在@bean、@Component配置的bean上加上@Qualifier。
  10. Bean的作用域设置
    我们可以通过@Scope注解声明bean的作用域,默认为单例,我们采用ConfigurableBeanFactory类的SCOPE_…样类型安全点,单例:Singleton,原型:Prototype,会话:Session,请求:Rquest。但是作为会话作用域,我们不能只加上@Scope注解,因为存在被注解的类作用域不同步情况,我们可以为其添加proxyMode代理,同样可以使用ScpedProxyMode类的常量,如果该bean是个接口我们可以INTERFACES,如果是个实现类我们用TARGET_CLASS
  11. 运行时值注入
    Spring提供了两种值注入,1使用属性占位符,声明属性源@PropertySource注解,该注解用于加载配置文件到Environment实体,但是如果我们使用自动装配bean时,我们可以用@Value注解如@Value(“${a.cc}“),但是想要使用@Value必须有PropertySourcesPlaceholderConfigurer,bean,所以需要使用javaconfig配置该bean。
    2.使用表达式语言进行值注入需要放在#{。。。。}中同样如果是自动装配bean时我们使用@Value
  12. 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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值