一
註解
除了使用xml方式配置實現注入(管理對象和對象之間的關係)操作之外,還可以用Annotation來提高我們寫代碼的靈活性和效率。
annotation方式給我們提供了一個最重要的功能:掃描!component-scan(不掃描怎麼知道你在哪個類加上了註解,提到註解就要想到掃描)
實例
1.Spring中要使用annotation,需要在配置文件中增加配置,如下是完整的applicationtext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-lazy-init="true" >
<context:component-scan base-package="com.bjsxt"></context:component-scan> <!-- context自動掃描com.bjsxt下的類 -->
<!--component-scan 組件掃描器,用了它後不用配置bean,spring會主動去搜索類,如果不用它,如果你寫了類不配置bean,容器是找不到bean的,
起到了簡化配置文件的作用。但有一點,加了掃描器後,spring的啓動會變慢,因爲會先去掃描類,在項目啓動的時候會把IOC容器創建好。
有的項目啓動得花一分鐘,解決辦法是在beans的開始標籤中加 default-lazy-init="true",在用的時候再實例化類-->
</beans>
2.UserDao.java
@Component //把普通pojo實例化到IOC容器中,相當於在IOC容器中new的UserDao,和在xml中配置bean是一樣的。
public class UserDao{
public UserDao(){
System.out.println("init.....");
}
public void add(){
System.out.println("add....");
}
}
3.UserAction.java
@Component //掃描的時候只會把這些帶了註解的類掃描進來,加個括號是給它改名字,默認是以這個類名爲名,@Component("ccc")
public class UserAction{
private UserDao userDao;
public UserDao getUserDao(){
return userDao;
}
@Resource(name="userDao")
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public String add(){
userDao.add();
return null;
}
}
哪個類想進入IOC容器,只需要在它的類名上加@Component,然後在它要建立的關係的方法上寫@Resource(name="userDao"),如果你用的是set注入,就在set方法上加,要是你用的是構造器注入,就在構造器上加,就這麼簡單。用Annotation創建IOC容器的對象的方法就這句話就全講明白了!
4.接下來測試
Test.java
public class Test{
public static void main(String[] args){
ApplicationContext ac = new ClassPathXmlApplicationContext(
new String[ ]{"ApplicatioinContext.xml"}
);
UserDao userDao = (UserDao) ac.getBean("userDao"); //雖然在xml中沒有配置它,但是註解配置了,所以用getBean也是可以獲取的。
}
}
執行下看能不能打印初始化中的init
—————————註解 end—————————————————————
IOC講完啦,就這麼簡單,管理對象,new一下,給它賦值,建立關聯。夠了!
*******題外********
對象和對象之間的關係包括:
依賴:對象之間最弱的一種關聯方式,是臨時性的關聯。代碼中一般指由局部變量、函數參數、返回值建立的對於其它對象的調用關係
關聯:對象之間一種引用關係,比如客戶類與訂單類之間的關係。這種關係通常使用類的屬性表達。
聚合:表示has-a的關係,是一種不穩定的包含關係。聚合類不必對被聚合類負責。使用集合屬性表達
********************************************************
二
AOP面向切面編程
核心思想是:彈性的設計,利用動態代理的底層實現,爲層與層之間,動態植入代碼。層和層之間有很多的調用關係。我們往裏面植入代碼,影響的是層和層之間的交流。
AOP是代碼重用的最佳案例。真正達到了寫一次用多次的效果。而且是可挺拔式的、插件式的。以前寫程序時是要寫個功能,需要到多個類裏面去修改,刪除時也要改動多個類。有了AOP就不用啦。爲避免這種情況,AOP是現在大型項目中必備的。
AOP主要應用於日誌記錄,性能統計,安全控制,事務處理等方面。AOP不是實現小功能的,它是用於實現公共設計代碼,如權限、系統日誌記錄、安全控制、事務的管理。新手一般接觸不到這方面的實現,或者是人家已經實現好了。AOP並不適合單一功能,所以叫面向切面編程。
一個請求來到服務器,會創建一個線程。這個線程會執行很多的方法,整個項目是由很多線程組成的。AOP是從業務流切入,加入功能,和代理很像。