Spring常用注解总结

一、基于注解的IOC配置:

前提:开启注解扫描:
<context:component-scan base-package="cn.itcast"></context:component-scan>
扫描指定包及其子包下的所有的类,如果类上使用了@Component注解,就将该类实例化并装配到IOC容器中。
①、@Component(value=""):相当于在xml中配置了一个bean。如果不指定value属性,默认bean的id是当前类的类名。首字母小写。
使用衍生注解装配bean(与@Component作用相同,只不过更加语义化)
②、@Controller:一般用于表现层的注解
③、@Service:一般用于业务层的注解
④、@Repository:一般用于持久层的注解
注意:如果注解中有且只有一个属性要赋值时,且名称是value,value在赋值时可以不写。

二、注入数据用的注解:

①、@Autowite :按照类型进行注入,只能注入bean类型。如果有多个类型匹配,自动将其属性名称accountDao作为id,到容器中去查找相同id的bean
②、@QuaLIfier("accountDao"):配合@Autowite使用,当按照类型注入,有多个类型匹配时,那么可以配置@Qualifier("accountDao")注解指定id注入bean
③、@Resource(name="accountDao"):可以直接指定id进行注入 (注意:该注解对应JDK1.9不支持)
④、@Value("张三") @Value(${jdbc.url}):直接注入或从配置文件注入基本数据类型

三、改变作用域及生命周期相关注解

改变作用域注解:
①、@Scope("prototype"):多例,不配默认为单例(@Scope("Singleton"))

指定生命周期注解:
①、@PostConstruct:该注解可以指定一个方法为初始化方法
②、@PreDestroy:该注解可以指定一个方法为销毁方法
以上两个注解JDK1.9也不支持

四、Spring配置类相关注解(取代applicationContext.xml)

①、@Configuration:声明配置类
代替applicationContext.xml的作用获取容器时需要使用AnnotationApplicationContext(有@Configuration注解的类.class)。
②、@ComponentScan:配置注解扫描
作用和在spring的xml配置文件中的:
<context:component-scan base-package="cn.itcast"></context:component-scan>一致
③、@Bean(name="beanName"):将方法的返回值装配到IOC容器中
name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)。
④、@PropertySource(values={"path1","path2"}):加载外部资源文件
values单独使用可以省略,也可以为数组形式values={}
⑤、@Import(value={config1.class,config2.clsss}):引入其他配置类
values单独使用可以省略,也可以为数组形式values={}
⑥配置类使用案例:

//JdbcConfig.java
@PropertySource(value = {"classpath:druiddb.properties"})
public class JdbConfig {
    @Value("${jdbc.driverClassName}")
    private String driverClassName;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    @Bean(name = "jdbcTemplate")
    public JdbcTemplate getJdbcTemplate(@Qualifier("dataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = "dataSource")
    public DataSource getDataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driverClassName);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return  druidDataSource;
    }
}
//springConfiguration.java
@Configuration
@ComponentScan("com.jingfu") //开启注解扫描
@Import(JdbConfig.class)
public class SpringConfiguration {
//其他配置
}

五、Spring整合junit相关注解

①、@RunWith(value=SpringJUnit4ClassRunner.class)
value单独使用也可以省略,配置SpringJUnit4ClassRunner.class来代替原来junit的运行器
②、@ContextConfiguration(values={},class={})
加载配置类或者xml配置文件
value[]:用来指定xml配置文件
class[]: 用来指定配置类
③ Spring整合junit4使用案例

//替换掉Junit运行器
@RunWith(SpringJUnit4ClassRunner.class)
//加载配置类
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class AccountServiceTest {
 //按照属性名自动注入service层接口   
    @Autowire
    private IAccountService accountService; 
    @Test
    public void queryAccountList() {
        List<Account> accounts = accountService.queryAccountList();
        for (Account account : accounts) {
            System.out.println(account);
        }
    }
}

六、Spring AOP相关注解

①、开启注解扫描和注解AOP
<context:component-scan base-package="cn.itcast"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
②、装配类并将此类声明为切面类@Component("logger")@Aspect

@Component("logger")
@Aspect //表示当前类是一个切面类(也可以称之为通知类)
public class Logger{}

③、配置通知类型
@Before(value=""):把当前方法看作前置通知。value:用于指定切入点表达式,还可以指定切入点表达式的引用
@AfterReturning(value=""):把当前方法看成是后置通知,value属性作用同上
@AfterThrowing(value=""):把当前方法看成是异常通知,value属性作用同上
@After:把当前方法看成是最终通知,value属性作用同上
@Around:把当前方法看成环绕通知,value属性作用同上
@Pointcut::指定切入点表达式
通过一个空方法单独配置切入点表达式。在其他通知引用该切入点表达式时通过:方法名称+(),来进行引用。

@Pointcut("execution(* com.jingfu.service.AccountServiceImpl.*(..))")
private void pt1() {}

④、@EnableAspectJAutoProxy:开启AOP的注解扫描与配置类结合使用
⑤、通过注解配置的切面类使用案例案例

//配置类
package com.jingfu.configuration;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration//声明为配置类
@ComponentScan("com.jingfu")//配置注解包扫描
@EnableAspectJAutoProxy//开启Aop的注解扫描
public class applicationConfig {
}

//q切面类
package com.jingfu.log;
@Component("logger")
@Aspect
public class Logger {
    @Pointcut("execution(* com.jingfu.service.AccountServiceImpl.*(..))")
    private void pt1() {}
   //前置通知
    @Before("pt1()")
    public void beforePrintLog(){
        System.out.println("前置通知执行了");
    }
    //后置通知
    @AfterReturning("pt1()")
    public void afterReturningPrintLog(){
        System.out.println("后置通知执行了");
    }
    //异常通知
    @AfterThrowing("pt1()")
    public void afterThrowingPrintLog(){
        System.out.println("异常通知执行了");
    }
    //最终通知
    @After("pt1()")
    public void afterPrintLog(){
        System.out.println("最终通知执行了");
    }


    /**环绕通知
     * spring框架为我们提供了一个借口,该接口可以作为环绕通知的方法参数来使用
     * ProceedingJoinPoint  当环绕通知执行时,spring框架会为我们注入该接口的实现类
     * 它有一个方法proceed(),就相当于invoke,执行目标方法
     *
     * spring的环绕通知
     *      它是spring为我们提供的一种可以在代码中手动控制增强方法何时执行的方式。
     * @param pjp
     * @return
     */
    @Around("pt1()")
    public Object around(ProceedingJoinPoint pjp){
        Object object = null;
        try {
            System.out.println("前置通知");
            object = pjp.proceed();
            System.out.println("后置通知");
        } catch (Throwable e) {
            System.out.println("异常通知");
            e.printStackTrace();
        } finally {
            System.out.println("最终通知");
        }
        return object;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 甜柠檬效应——择业,不能一条路走到黑 挫折心理学中,人们把个体在追求预期目标失败时,为了冲淡自己内心的不安,就百般...
    晓风逐月阅读 666评论 0 0
  • 投了蓝色光标的简历 被工作逼的剪了音频 给妈妈打了电话 白天工作的一点不痛快消退了 看了《一条狗的使命》很温馨感动
    活跃在兔子毛顶端阅读 120评论 0 0
  • 岁月留白,一缕清风,吹佛了谁的碎发。一曲《凤求凰》拨动了谁的心弦,一首《风声》引起谁的共鸣,一首《想你》唱出谁的心...
    暮雪沉浮阅读 173评论 0 0
  • 路上的船飞走了 他没有渡河 天气很冷
    明月千思阅读 152评论 2 3