day42 spring注解配置

1.注解配置spring

  • 導包4+2+spring-aop(注解包,新版需要導入)
  • 1.為主配置文件引入新的命名空間(約束)
  • 2.開啟使用注解代理配置文件
<!-- 指定掃描cn.itcast.bean報下的所有類中的注解.
     注意:掃描包時.會掃描指定報下的所有子孫包
 -->
<context:component-scan base-package="cn.itcast.bean"></context:component-scan>
<bean name="car2" class="cn.itcast.bean.Car"  >
    <property name="name" value="布加迪威龍" ></property>
    <property name="color" value="black"  ></property>
</bean>
---------------------------
//<bean name="user" class="cn.itcast.bean.User"  />
//@Component("user")
//  @Service("user") // service層
//  @Controller("user") // web層
    @Repository("user")// dao層
//指定對象的作用范圍
@Scope(scopeName="singleton")
public class User {
    private String name;
    @Value("18")
    private Integer age;
    
    //@Autowired //自動裝配
    //問題:如果匹配多個類型一致的對象.將無法選擇具體注入哪一個對象.
    //@Qualifier("car2")//使用@Qualifier注解告訴spring容器自動裝配哪個名稱的對象
    
    @Resource(name="car")//手動注入,指定注入哪個名稱的對象
    private Car car;
@Value("tom")   
    public void setName(String name) {
        this.name = name;
    }
@PostConstruct //在對象被創建后調用.init-method
    public void init(){
        System.out.println("我是初始化方法!");
    }
    @PreDestroy //在銷毀之前調用.destory-method
    public void destory(){
        System.out.println("我是銷毀方法!");
    }

2.sts自動配置全類名
3.spring與junit整合測試

  • 需要多一個test包
//幫我們創建容器
@RunWith(SpringJUnit4ClassRunner.class)
//指定創建容器時使用哪個配置文件
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo {
    //將名為user的對象注入到u變量中
    @Resource(name="user")
    private User u; 
    @Test
    public void fun1(){     
        System.out.println(u);      
    }
----------------------car中
@Component("car")
public class Car {
    @Value("瑪莎拉蒂")
    private String  name;
    @Value("嘔吐綠")
    private String color;
    

4.spring中的aop

  • aop概念
- 思想:縱向重復代碼橫向提取
- spring中幫助我們生成代理對象
- 有兩種生成思路
1.動態代理(優先)
    被代理對象必須要實現接口,才能產生代理對象.如果沒有接口將不能使用動態代理技術
2.cglib代理(沒有接口)
    第三方代理技術,cglib代理.可以對任何類生成代理.代理的原理是對目標對象進行繼承代理. 如果目標對象被final修飾.那么該類無法被cglib代理.
image.png

5.實例

  • 導包4+2,另外的aop包
spring的aop包
    spring-aspects-4.2.4.RELEASE.jar
    spring-aop-4.2.4.RELEASE.jar
spring需要第三方aop包
    com.springsource.org.aopalliance-1.0.0.jar
    com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
  • 準備目標對象
public class UserServiceImpl implements UserService {
    @Override
    public void save() {
        System.out.println("保存用戶!");
        //int i = 1/0;
    }
    @Override
    public void delete() {
        System.out.println("刪除用戶!");
    }
    @Override
    public void update() {
        System.out.println("更新用戶!");
    }
    @Override
    public void find() {
        System.out.println("查找用戶!");
    }
}
  • 準備通知
//通知類
public class MyAdvice {
    
    //前置通知  
//      |-目標方法運行之前調用
    //后置通知(如果出現異常不會調用)
//      |-在目標方法運行之后調用
    //環繞通知
//      |-在目標方法之前和之后都調用
    //異常攔截通知
//      |-如果出現異常,就會調用
    //后置通知(無論是否出現 異常都會調用)
//      |-在目標方法運行之后調用
//----------------------------------------------------------------
    //前置通知
    public void before(){
        System.out.println("這是前置通知!!");
    }
    //后置通知
    public void afterReturning(){
        System.out.println("這是后置通知(如果出現異常不會調用)!!");
    }
    //環繞通知
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("這是環繞通知之前的部分!!");
        Object proceed = pjp.proceed();//調用目標方法
        System.out.println("這是環繞通知之后的部分!!");
        return proceed;
    }
    //異常通知
    public void afterException(){
        System.out.println("出事啦!出現異常了!!");
    }
    //后置通知
    public void after(){
        System.out.println("這是后置通知(出現異常也會調用)!!");
    }
}

-4.配置進行織入,將通知織入目標對象中

<!-- 準備工作: 導入aop(約束)命名空間 -->
<!-- 1.配置目標對象 -->
    <bean name="userService" class="cn.itcast.service.UserServiceImpl" ></bean>
<!-- 2.配置通知對象 -->
    <bean name="myAdvice" class="cn.itcast.d_springaop.MyAdvice" ></bean>
<!-- 3.配置將通知織入目標對象 -->
    <aop:config>
        <!-- 配置切入點 
            public void cn.itcast.service.UserServiceImpl.save() 
            void cn.itcast.service.UserServiceImpl.save()
            * cn.itcast.service.UserServiceImpl.save()
            * cn.itcast.service.UserServiceImpl.*()
            
            * cn.itcast.service.*ServiceImpl.*(..)
            * cn.itcast.service..*ServiceImpl.*(..)
        -->
        <aop:pointcut expression="execution(* cn.itcast.service.*ServiceImpl.*(..))" id="pc"/>
        <aop:aspect ref="myAdvice" >
            <!-- 指定名為before方法作為前置通知 -->
            <aop:before method="before" pointcut-ref="pc" />
            <!-- 后置 -->
            <aop:after-returning method="afterReturning" pointcut-ref="pc" />
            <!-- 環繞通知 -->
            <aop:around method="around" pointcut-ref="pc" />
            <!-- 異常攔截通知 -->
            <aop:after-throwing method="afterException" pointcut-ref="pc"/>
            <!-- 后置 -->
            <aop:after method="after" pointcut-ref="pc"/>
        </aop:aspect>
    </aop:config>
</beans>

6.使用注解完成織入

  • 配置前兩步目標對象和通知對象
<!-- 準備工作: 導入aop(約束)命名空間 -->
<!-- 1.配置目標對象 -->
    <bean name="userService" class="cn.itcast.service.UserServiceImpl" ></bean>
<!-- 2.配置通知對象 -->
    <bean name="myAdvice" class="cn.itcast.e_annotationaop.MyAdvice" ></bean>
<!-- 3.開啟使用注解完成織入 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
  • 通知類中
//通知類
@Aspect
//表示該類是一個通知類
public class MyAdvice {
    @Pointcut("execution(* cn.itcast.service.*ServiceImpl.*(..))")
    public void pc(){}
    //前置通知
    //指定該方法是前置通知,并制定切入點
    @Before("MyAdvice.pc()")
    public void before(){
        System.out.println("這是前置通知!!");
    }
    //后置通知
    @AfterReturning("execution(* cn.itcast.service.*ServiceImpl.*(..))")
    public void afterReturning(){
        System.out.println("這是后置通知(如果出現異常不會調用)!!");
    }
    //環繞通知
    @Around("execution(* cn.itcast.service.*ServiceImpl.*(..))")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("這是環繞通知之前的部分!!");
        Object proceed = pjp.proceed();//調用目標方法
        System.out.println("這是環繞通知之后的部分!!");
        return proceed;
    }
    //異常通知
    @AfterThrowing("execution(* cn.itcast.service.*ServiceImpl.*(..))")
    public void afterException(){
        System.out.println("出事啦!出現異常了!!");
    }
    //后置通知
    @After("execution(* cn.itcast.service.*ServiceImpl.*(..))")
    public void after(){
        System.out.println("這是后置通知(出現異常也會調用)!!");
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,973評論 6 342
  • 本章內容: 面向切面編程的基本原理 通過POJO創建切面 使用@AspectJ注解 為AspectJ切面注入依賴 ...
    謝隨安閱讀 3,203評論 0 9
  • 今天晚班,所以說打卡比較晚。今天已經有人開始閱讀《最重要的兩個小時》,而我的《自控力》還沒看完,有點無奈! 我昨...
    一顆有趣的豆閱讀 176評論 0 0
  • 斷舍離還真的是可以延伸運用到其他的地方,特別是對身心靈成長是很有幫助的。當斷舍離遇到“對結束的關系說是”那又會是怎...
    自由葉子閱讀 429評論 0 5