Java mac idea spring的使用02

1.使用注解配置spring

1.1 引入新的命名空間(約束)

如果是使用eclipse的同學,那么肯定是很熟悉這個了蜓洪。使用idea的話,就不需要自己引入了,idea已經(jīng)將約束添加好了

1.2 在spring的配置文件中開啟注解

<!--指定掃面 bean 包下的所有類 的注解-->
    <context:component-scan base-package="bean"/>

1.3 在類中使用注解

// 相當于在xml配置文件中寫<bean name="user" class="bean.user" />
@Component("user") // 早期使用文狱,當初只有component,后續(xù)細化出了下面三個缘挽,用于不同的層瞄崇,方便閱讀
    @Service("user")    // service層
    @Controller("user") // web層
    @Repository("user") // dao層

1.4 測試

@Test
    public void testFunc01() {

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

        User user = (User) applicationContext.getBean("user");

        System.out.println(user);
    }

2. 使用注解

2.1 使用Scpoe

@Repository("user") // dao層
@Scope("prototype")
public class User {
    private String name;
    private Integer age;
    private Dog dog;

2.2 基本數(shù)據(jù)類型賦值

  1. 在屬性上賦值
    通過反射的field賦值,破壞封裝性壕曼,但是可讀性好
public class User {
    @Value("tom")
    private String name;

    @Value("18")
    private Integer age;
  1. 在set方法上賦值
    在set方法賦值苏研,推薦使用,但是可讀性不太好
@Value("tom")
    public void setName(String name) {
        this.name = name;
    }

    @Value("18")
    public Integer getAge() {
        return age;
    }

2.3 引用類型賦值

先給dog類賦值

@Component("dog")
public class Dog {

    @Value("柯基")
    private String name;
    @Value("3")
    private Integer age;
  1. 手動注入腮郊,指定注入哪個名稱的對象
    @Resource(name = "dog")
    private Dog dog;
  1. @Autowired 自動裝配
    問題:如果發(fā)現(xiàn)多個類型一致的對象摹蘑,將無法選擇具體注入哪一個對象
    如果需要指定注入某一個對象,需要添加輔助注解

在User 中只需要添加注解

    @Autowired
    @Qualifier("dog2")
    private Dog dog;

2.4 創(chuàng)建和銷毀注解

@PostConstruct // 在對象創(chuàng)建后調(diào)用轧飞,相當于init-method
    public void init() {
        System.out.println("初始化方法調(diào)用");
    }

    @PreDestroy // 在對象銷毀之前調(diào)用衅鹿,相當于destroy-method
    public void destroy() {
        System.out.println("銷毀方法調(diào)用");
    }

3. spring junit整合測試

這樣就不需要在每個測試方法中都重復(fù)書寫獲取對象的代碼

// 幫我們創(chuàng)建容器
@RunWith(SpringJUnit4ClassRunner.class)

// 指定創(chuàng)建容器使用哪一個配置文件
@ContextConfiguration("classpath:applicationContext.xml")
public class Test02 {

    @Resource(name = "user")
    private User user;

    @Test
    public void testFunc01() {

        System.out.println(user);
    }
}

4. spring aop

4.1 aop 名詞

  1. Joinpoint(連接點):目標對象中,所有可以增強的方法过咬。(可以增強的方法)

  2. Pointcut(切入點):目標對象中大渤,已經(jīng)被增強的方法。(已經(jīng)增強的方法)

  3. Advice(通知/增強):增強的代碼掸绞。(例如:打開事務(wù)泵三,關(guān)閉事務(wù))

  4. Target(目標對象):被代理對象

  5. Weaving(織入):將通知應(yīng)用到連接點的過程

6.Proxy(代理):將通知織入到目標對象之后,形成代理對象

7.Aspect(切面):切入點+通知

4.2 配置將通知織入目標對象

  1. 準備一個通知類
/// 通知類
public class MyAdvice {
    public MyAdvice() {
    }

    // 前置通知 -》目標方法調(diào)用之前調(diào)用
    public void before() { System.out.println("這是前置通知"); }

    // 后置通知(如果出現(xiàn)異常不會調(diào)用)-》在目標方法調(diào)用之后調(diào)用
    public void afterReturning() { System.out.println("這是后置通知"); }

    // 環(huán)繞通知 -》在目標方法調(diào)用之前和之后都調(diào)用
    public Object around(ProceedingJoinPoint pjp) throws Throwable {

        // 調(diào)用目標方法
        System.out.println("這是環(huán)繞通知前部分");
        Object proceed = pjp.proceed();
        System.out.println("這是環(huán)繞通知后部分");
        return proceed;
    }

    // 異常攔截通知 -》如果出現(xiàn)異常會調(diào)用
    public void afterException() {
        System.out.println("這是異常攔截通知");
    }

    // 后置通知(如果出現(xiàn)異常仍會調(diào)用)-》在目標方法調(diào)用之后調(diào)用
    public void after() {
        System.out.println("這是后置通知-出現(xiàn)異常仍會調(diào)用");
    }

}
  1. 配置通知對象和通知方法
 <!--配置目標對象-->
    <bean name="userService" class="service.UserServiceImpl"></bean>

    <!--配置通知對象-->
    <bean name="myAdvice" class="springAop.MyAdvice"></bean>

    <!--配置將通知織入目標對象-->
    <!--
        public void service.UserServiceImpl.save()
        void service.UserServiceImpl.save()
        * service.UserServiceImpl.*()
        * service.*ServiceImpl.*(..)
    -->
    <aop:config>
        <aop:pointcut expression="execution(* service.*ServiceImpl.*(..))" id="pc"/>

        <aop:aspect ref="myAdvice" >
            <!-- 指定名為before方法作為前置通知 -->
            <aop:before method="before" pointcut-ref="pc" />
            <!-- 后置 -->
            <aop:after-returning method="afterReturning" pointcut-ref="pc" />
            <!-- 環(huán)繞通知 -->
            <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>

3.進行測試

// 幫我們創(chuàng)建容器
@RunWith(SpringJUnit4ClassRunner.class)
// 指定創(chuàng)建容器使用哪一個配置文件
@ContextConfiguration("classpath:springAop/applicationContext.xml")
public class Test03 {

    @Resource(name = "userService")
    private UserService us;

    @Test
    public void testFunc01() {

        us.save();
    }
}
  1. 結(jié)果輸出


    Snip20180802_16.png

4.3 使用注解配置 將通知織入目標對象

1.在配置文件中開啟自動代理

<aop:aspectj-autoproxy/>

2.在通知類中進行配置

/// 通知類
@Aspect
public class MyAdvice {

    @Pointcut("execution(* service.UserServiceImpl.*(..))")
    public void pc() {}

    // 前置通知 -》目標方法調(diào)用之前調(diào)用
    @Before("MyAdvice.pc()")
    public void before() { System.out.println("這是前置通知"); }

    // 后置通知(如果出現(xiàn)異常不會調(diào)用)-》在目標方法調(diào)用之后調(diào)用
    @AfterReturning("MyAdvice.pc()")
    public void afterReturning() { System.out.println("這是后置通知 (如果出現(xiàn)異常不會調(diào)用)"); }

    // 環(huán)繞通知 -》在目標方法調(diào)用之前和之后都調(diào)用
    @Around("MyAdvice.pc()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {

        // 調(diào)用目標方法
        System.out.println("這是環(huán)繞通知前部分");
        Object proceed = pjp.proceed();
        System.out.println("這是環(huán)繞通知后部分");
        return proceed;
    }

    // 異常攔截通知 -》如果出現(xiàn)異常會調(diào)用
    @AfterThrowing("MyAdvice.pc()")
    public void afterException() {
        System.out.println("這是異常攔截通知");
    }

    // 后置通知(如果出現(xiàn)異常仍會調(diào)用)-》在目標方法調(diào)用之后調(diào)用
    @After("MyAdvice.pc()")
    public void after() {
        System.out.println("這是后置通知(如果出現(xiàn)異常仍會調(diào)用)");
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衔掸,一起剝皮案震驚了整個濱河市烫幕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敞映,老刑警劉巖较曼,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異振愿,居然都是意外死亡捷犹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門埃疫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伏恐,“玉大人,你說我怎么就攤上這事栓霜〈滂耄” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長销凑。 經(jīng)常有香客問我丛晌,道長,這世上最難降的妖魔是什么斗幼? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任澎蛛,我火速辦了婚禮,結(jié)果婚禮上蜕窿,老公的妹妹穿的比我還像新娘谋逻。我一直安慰自己,他們只是感情好桐经,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布毁兆。 她就那樣靜靜地躺著,像睡著了一般阴挣。 火紅的嫁衣襯著肌膚如雪气堕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天畔咧,我揣著相機與錄音茎芭,去河邊找鬼。 笑死誓沸,一個胖子當著我的面吹牛梅桩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔽介,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼摘投,長吁一口氣:“原來是場噩夢啊……” “哼煮寡!你這毒婦竟也來了虹蓄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤幸撕,失蹤者是張志新(化名)和其女友劉穎薇组,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坐儿,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡律胀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了貌矿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炭菌。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逛漫,靈堂內(nèi)的尸體忽然破棺而出黑低,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布克握,位于F島的核電站蕾管,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏菩暗。R本人自食惡果不足惜掰曾,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望停团。 院中可真熱鬧旷坦,春花似錦、人聲如沸佑稠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讶坯。三九已至番电,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辆琅,已是汗流浹背漱办。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留婉烟,地道東北人娩井。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像似袁,于是被迫代替她去往敵國和親洞辣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容