這篇文章主要介紹了Spring IOC和aop的原理及實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
成都創(chuàng)新互聯(lián)是一家集網站建設,資中企業(yè)網站建設,資中品牌網站建設,網站定制,資中網站建設報價,網絡營銷,網絡優(yōu)化,資中網站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網站。
Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。特點是面向接口編程,松耦合。
1:IOC(控制反轉) 別名(DI:依賴注入)
首先來一段ioc的實現原來代碼:
public class ClassPathXmlApplicationContext implements BeanFactory { private Map<String , Object> beans = new HashMap<String, Object>(); //IOC Inverse of Control DI Dependency Injection public ClassPathXmlApplicationContext() throws Exception { SAXBuilder sb=new SAXBuilder(); //解析xml配置文件 Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); Element root=doc.getRootElement(); //獲取根元素 List list=root.getChildren("bean");//根元素下的子元素 for(int i=0;i<list.size();i++) { Element element=(Element)list.get(i); String id=element.getAttributeValue("id"); String clazz=element.getAttributeValue("class"); Object o = Class.forName(clazz).newInstance(); //反射獲得實例 System.out.println(id); System.out.println(clazz); beans.put(id, o); //注入bean屬性 for(Element propertyElement : (List<Element>)element.getChildren("property")) { String name = propertyElement.getAttributeValue("name"); //userDAO String bean = propertyElement.getAttributeValue("bean"); //u Object beanObject = beans.get(bean);//UserDAOImpl instance String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); System.out.println("method name = " + methodName); Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]); m.invoke(o, beanObject); } } } public Object getBean(String id) { return beans.get(id); } }
//xml文件 <beans> <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl" /> <bean id="userService" class="com.bjsxt.service.UserService" > <property name="userDAO" bean="u"/> </bean> </beans>
以上代碼實現了將UserDAOImpl注入到userService.
值得注意的是:以上操作都是spring幫我們實現的,我們只需要理解如何配置即可。
spring還提供了bean的生存周期和范圍屬性:
scope:singleton(單例,即每次調用的對象都為同一個)。 prototype(原型,即以bean對象為原型,每次new一個新對象出來)
init-method="init" destroy-method="destroy" lazy-init="true"(延遲初始化bean,即spring啟動時,不初始化bean,當需要使用時才實例化,作用:但spring啟動緩慢時可使用)
現在基本都是用注解實現,但只要能明白spring是如何實現bean的注入,基本原理都是一樣的。spring在中間的作用就是幫我們實現元素之前的注入,誰注入到誰就需要用到不同的注解了。
AOP(切面編程)
首先還是先來一段代碼
定義一個InvocationHandler的實現類
public class UserServiceTest { @Test public void testAdd() throws Exception { BeanFactory applicationContext = new ClassPathXmlApplicationContext(); UserService service = (UserService)applicationContext.getBean("userService"); User u = new User(); u.setUsername("zhangsan"); u.setPassword("zhangsan"); service.add(u); } @Test public void testProxy() { UserDAO userDAO = new UserDAOImpl(); LogInterceptor li = new LogInterceptor(); li.setTarget(userDAO); UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li); userDAOProxy.delete(); userDAOProxy.save(new User()); }
調用測試類,service和DAO實現類沒有貼出來,就是打印一句話出來表現方法執(zhí)行了。
public class LogInterceptor implements InvocationHandler { private Object target; public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } public void beforeMethod(Method m) { System.out.println(m.getName() + " start"); } @Override public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { beforeMethod(m); m.invoke(target, args); return null; } }
以上代碼簡單的實現了一個動態(tài)代理,并執(zhí)行了自己的一段邏輯。
那么aop是如何實現切面編程的呢,就是通過動態(tài)代理。當然這也是spring來實現的,而我們需要做的就是知道如何編寫編織語法。
需要注意的是:被產生代理的對象需要現實接口spring才能產生代理對象,默認使用java se 中的 InvocationHandler 和 proxy 兩個類產生代理對象,若沒有實現接口,則需要另外引入一個jar包(cglib-nodep-2.1_3.jar);他是通過二進流的方式產生代理對象。
那么spring 幫我們做了什么?
1:充分利用java se 中的反射機制幫助我們對對象的注入,即 IOC,
2: 也是java se 中的動態(tài)代理幫助我們實現 切面編程,當然我們也需要熟悉一下asceptj 的切入語法。這就是aop。
所以這里可以總結一下,java se 的特點有反射,動態(tài)代理,(這里面必然會用到多態(tài),動態(tài)綁定)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
分享文章:SpringIOC和aop的原理及實例詳解
文章出自:http://www.rwnh.cn/article40/jgjpeo.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站策劃、云服務器、網站改版、自適應網站、網站維護、品牌網站制作
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)