【spring-应用】

一、给容器注入组件方法

1、@ComponentScan

包扫描,默认扫描当前包下的所有包含@Component的组件,即:@Controller/@Service/@Repository/@Component

2、@Bean

@Bean@Configuration结合使用,@Bean使用在方法上,用于导入第三方包的组件

3、@Import注入

  • @Import({xxx.class})导入相关的类,使用全包名作为名称
  • @Import({ImportSelector.class}) 实现ImportSelector的类中方法String[] selectImports(AnnotationMetadata var1),用于导入String[]包定义
  • @Import({ImportBeanDefinitionRegistrar.class}) 实现ImportBeanDefinitionRegistrar的类中方法void registerBeanDefinitions(AnnotationMetadata var1, BeanDefinitionRegistry var2),用于注册导入信息

4、FactoryBean

  • @Bean和实现FactoryBean接口的类整合使用
  • 默认获取到的是getObject创建的对象
  • 要获取工厂本身,加上前缀&
public interface FactoryBean<T> {
    @Nullable
    T getObject() throws Exception;

    @Nullable
    Class<?> getObjectType();

  // 是否单例模式,true:单例模式,false:多例模式
    default boolean isSingleton() {
        return true;
    }
}

class ColorFactoryBean Implement FactoryBean<Color>{
....
}

@Bean
public ColorFactoryBean colorFacotryBean(){
  return new ColorFactoryBean();
}

二、bean的生命周期

bean的生命周期:创建-初始化-销毁

1、 指定初始化和销毁时调用方法

  • 创建: 单实例 在容器每次启动时创建对象;多实例 在每次获取的时候创建对象
  • 初始化:对象创建好,并赋值好的时候调用初始化方法
  • 销毁:单实例 容器关闭的时候;多实例:容器不管理这个Bean,容器不会调用销毁方法

方法一:使用@Bean的属性值

// initMethod : 初始化调用;destroyMethod:销毁时调用
@Bean(initMethod = "",destroyMethod = "")

方法二:通过Bean实现InitializingBean和DisposableBean接口实现afterPropertiesSet()和destroy()方法

invokeInitMethods中执行。

public class Car implements InitializingBean, DisposableBean {

    public Car(){

    }
    
    @Override
    public void afterPropertiesSet() throws Exception {

    }

    @Override
    public void destroy() throws Exception {

    }


}

方法三:使用@PostConstrust和@PreDestroy注解

本质是在初始化前/后(beanProcessor)通过LifecycleMetadata注解信息注入,即在applyBeanPostProcessorsBeforeInitializationapplyBeanPostProcessorsAfterInitialization进行。

@Component
public class Car  {

    public Car(){

    }
    
    @PostConstruct
    public void init(){

    }

    @PreDestroy
    public void destroy() {

    }
}

方法四:使用实现BeanPostProcessor 的类执行器

// 对所有的bean实例实现以下执行器
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    // 初始化方法之前
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
    
    // 初始化方法之后
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

方法一二是初始化时执行,方法三四是后置处理器在初始化前后执行

三、值注入

spring_@Value/@PropertySource..

  • @value:可以赋值给指定的属性,配合使用@Configuration可以获得文件中的值,默认会获得系统默认的application.properties,使用@Value("${id}")可以访问properties文件的key-value,也可以通过@PropertySource("classpath:applicaiton.yml")自定义设置,如果使用@Component导入,如果异常可采用@ConfigurationProperties(prefix="")注解定义前缀获得。

  • @PropertySource():在configuration类中指定使用的环境文件

  • @Autowired:注入容器,优先按照类型注入,如果存在多个同类型,按照属性名称相同注入

  • @Qualifier("xxx"):指定需要装配的组件id,而不是属性名,使用在@Autowired上面,对@Autowired注入进行筛选,选择组件id符合Qulifier的组件注入

  • @Primary:与@Component组件一起,说明此组件优先注入,优先级小于@Quealifier

@Resource

不支持spring上述注解,基于java规范JSR-250

@Inject

需要导入Javax.inject

四、@profile

使用profile切换环境配置,将@profile("dev")添加到组件的注解上,表示该组件在dev环境时会创建使用,默认是default,即所有环境都会使用。

启动1:命令行

// dev为自己在配置文件中定义的环境名称
java -jar -Dspring.profiles.active=dev xxx.jar

启动2:配置文件设置

// 在配置文件例如:application.properties
spring.profile.active=dev

// 或者如果是application.yml
spring:
    profile:
      active: dev

spring-boot的profile

在application.yml(application.properties)中设置active,即采用第二种启动方式

spring:
  profiles:
    active: dev

在application.yml同级目录创建application-dev.yml,即在环境运行时,自动导入的是application.yml和application-dev.yml配置。同时可以设置application-prod.yml生产环境。在不同环境设置数据库信息,以备切换不同环境使用。

五、spring aop

1、定义切面类

@Aspect
@Component
public class LogAspect {

    @Pointcut("execution(* com.example.service.*.*(..))")
    public void pointcut(){};

    @Before("execution(public void com.example.service.RunService.start())")
    public void logStart(JoinPoint joinPoint){
        System.out.println("AOP切入————Before————"+joinPoint.getSignature().getName()+"————"+ Arrays.asList(joinPoint.getArgs()));
    }

    @After("pointcut()")
    public void logAfter(JoinPoint joinPoint){
        System.out.println("AOP切入————After————"+joinPoint.getSignature().getName()+"————"+ Arrays.asList(joinPoint.getArgs()));
    }

    @AfterReturning(value = "pointcut()",returning = "result")
    public void logReturn(JoinPoint joinPoint, Object result){
        System.out.println("AOP切入————Return————"+result+"————"+joinPoint.getSignature().getName()+"————"+ Arrays.asList(joinPoint.getArgs()));
    }

    @AfterThrowing(value = "pointcut()",throwing = "exception")
    public void logException(JoinPoint joinPoint,Exception exception){
        System.out.println("AOP切入————Exception————"+exception+"————"+joinPoint.getSignature().getName());
    }

    @Around("pointcut()")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("AOP切入————Around1————");
        Object proceed = joinPoint.proceed();
        System.out.println("AOP切入————Around2————");
        return proceed;
    }
}

2、开启代理

@EnableAspectJAutoProxy
@Configuration
public class MainConfig {

}

@Conditional

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345