Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
SpringIOCºÍAOPÔ­Àí Éè¼ÆÄ£Ê½
 
  3243  次浏览      28
 2019-6-17
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚjianshu£¬±¾ÎÄÖ÷Òª½éÉÜSpringAOPºÍSpringIOCµÄÌØµã£¬SpringIOCÈÝÆ÷¼ÓÔØBeanµÄ¹ý³Ì£¬ÒÔ¼°AOPµÄÁ½ÖÖʵÏÖ·½Ê½µÈÏà¹ØÄÚÈÝ¡£

SpringIOCµÄÌØµã

ÔÚ½Ó´¥SpringµÄ¹ý³ÌÖУ¬Ìýµ½×î¶àµÄÎÞ·ÇÁ½¸öÃû´Ê£¬Ò»¸öÊÇ¿ØÖÆ·´×ªÒ»¸öÊÇÒÀÀµ×¢È롣ʵ¼ÊÕâÊÇÒ»¸öÒâ˼£¬¿ØÖÆ·´×ª´ú±íÔ­À´ÓɳÌÐò±¾ÉíÈ¥¿ØÖƶÔÏóÖ®¼äµÄÒÀÀµ¹ØÏµµÄÕâÖÖ¸ñ¾Ö±»·´×ªÁË£¬Í¨¹ýµÚÈý·½ÈÝÆ÷£¨IOC£©È¥Íê³É¿ØÖÆÕâЩ¶ÔÏóµÄÒÀÀµµÄ¹ØÏµ²¢¶ÔËüÃǽøÐм¯ÖйÜÀí¡£

ÒÀÀµ×¢È룺»ñµÃÒÀÀµ¶ÔÏóµÄ¹ý³ÌÓÉ×ÔÉí¹ÜÀí±äΪÁËÓÉIOCÈÝÆ÷Ö÷¶¯×¢È룬¾ÍÊÇÓÉIOCÈÝÆ÷ÔÚÔËÐÐÆÚ¼ä£¬¶¯Ì¬µØ½«Ä³ÖÖÒÀÀµ¹ØÏµ×¢Èëµ½¶ÔÏóÖ®ÖС£

SpringAOPµÄÌØµã

AOP×î¶àÌýµ½µÄ¾ÍÊÇÃæÏòÇÐÃæ±à³Ì£¬ÄǶÔÓÚÕâ¸öÃû´Ê£¬ÎÒµÚÒ»´ÎÌýµ½µÄʱºòÒ²ÊDz»ÄÜÀí½âµÄ¡£

ÏÂÃæÓÃÒ»¸öͼºÍÓïÑÔÀ´½øÐÐÃèÊö£º

ÇÐÃæ

ÔÚÒ»¸öÏîÄ¿ÖкÍÎÒÃÇÒµÎñÂß¼­ºÍͨÓõÄÂß¼­Çø·Ö¿ªÀ´£¬±ÈÈçÎÒÃǵÄÒ»¸öϵͳÐèÒª¼Ç¼ÈÕÖ¾£¬¼Ç¼ÈÕÖ¾Õâ¸öÊÂÇéÊÇͨÓõ쬲»¹ÜÄã×öʲôϵͳһ°ã¶¼»áÉæ¼°¡£ÄÇôÕâÒ»¿é¾Íͨ¹ýAOPÀ´Í³Ò»¼¯ÖÐʵÏÖ£¬Í³Ò»¹ÜÀí¡£

Éú»îÖеÄÒ»¸öÀý×Ó£¬ÄãÈ¥³Ô·¹Ö®Ç°¿Ï¶¨ÒªÏ´ÊÖ£¬·¹ºó¿Ï¶¨Òª²Á×ì¡£ÄÇô£¬²»¹ÜÄã³Ôʲô·¹ÔÚÄĸöµØ·½³Ô¡£ÕâЩͨÓõĹý³ÌÄã¶¼ÒªÖ´ÐС£ÄÇô¼¯ÖгéÏó³öÀ´ÕâЩ·½·¨£¬Ò²¾ÍÐγÉÁËAOP¡£

SpringIOCÈÝÆ÷¼ÓÔØBeanµÄ¹ý³Ì

1.µÚÒ»²½ IOCÈÝÆ÷

³õʼ»¯

°ÑxmlÎļþλÖÃÐÅÏ¢±£´æ£¬È»ºóµ÷ÓÃrefresh·½·¨È¥ÖØÐ³õʼ»¯Ò»¸öеÄIOCÈÝÆ÷£¬Refresh·½·¨ÖÐʹÓÃobtainFreshBeanFactoryÈ¥»ñÈ¡£¬ºóÃæµÄ´úÂëÊÇһЩBeanFactory´´½¨ºóµÄºó´¦Àí¹ý³Ì

1.1

obtainFreshBeanFactory·½·¨ÀïÃæ£¬ÎÒÃÇ¿´µ½µÚÒ»Ðе÷ÓÃrefreshBeanFactoryµÄ·½·¨È¥´´½¨¡£

1.2

ÔÚ·½·¨ÖÐÈ¥loadBeanDefintions£¨£©£¬Ê¹ÓÃXMLReaderÈ¥½âÎöÎÒÃǵÄxmlÅäÖÃÎļþ

1.3

ºóÃæÊ¡ÂÔһЩԴÂëµÄ²½Ö裬Ö÷Òª×öµÄ¾ÍÊǶÔxmlÎļþ½øÐнâÎö³ÉÎÒÃÇÒªµÄBeanDefinitions£¬´¦Àíÿ¸öBeanÔªËØÒÔ¼°ÔªËØÖеÄÊôÐÔÖµ¡£×îºó°ÑbeanDefinition×¢²á½øÎÒÃǵÄBeanFactoryÖУ¬

1.4

2.×¢ÈëÒÀÀµ

2.1

2.2

AOPµÄÁ½ÖÖʵÏÖ·½Ê½ ÒÔ¼°Ð¡Àý×Ó

Ö÷ÒªÊÇÁ½ÖÖ£¬Ò»ÖÖÊÇJDK¶¯Ì¬´úÀí£¬Ò»ÖÖÊÇCglib´úÀí¡£

Á½ÕßµÄÇø±ð£º

1.JDK¶¯Ì¬´úÀíÖ»ÄÜ´úÀíʵÏÖÁ˽ӿڵÄÀ࣬¶¯Ì¬´úÀíÀàµÄ×Ö½ÚÂëÔÚ³ÌÐòÔËÐÐʱÓÉJava·´Éä»úÖÆ¶¯Ì¬Éú³É¡£

2.CglibÊÇ¿ÉÒÔ´úÀíûÓÐʵÏÖ½Ó¿ÚµÄÀ࣬cglibÊÇÕë¶ÔÀàÀ´ÊµÏÖ´úÀíµÄ£¬ËûµÄÔ­ÀíÊǶÔÖ¸¶¨µÄÄ¿±êÀàÉú³ÉÒ»¸ö×ÓÀ࣬²¢¸²¸ÇÆäÖз½·¨ÊµÏÖÔöÇ¿£¬ËùÒÔ²»ÄܶÔfinalÐÞÊεÄÀà½øÐдúÀí¡£µ×²ã²ÉÓÃASMʵÏÖ¡£

CglibµÄÀý×Ó£º

package com.Model.CGlibProxy;

public interface AddBook {
public void addbook();
}

package com.Model.CGlibProxy;
public class AddBookImp implements AddBook {
@Override
public void addbook() {
// TODO Auto-generated method stub
System.out.println("Ìí¼ÓÊé¼®....");
}
}

package com.Model.CGlibProxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor {
private Object target;
public Object getInstance(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
// ÉèÖÃ×Ô¼ºµÄ¸¸Àà
enhancer.setSuperclass(target.getClass());
// ¹ØÁªµÄҪʹÓÃÄĸö¶ÔÏóµÄ»Øµ÷º¯Êý ÕâÀïÖ¸Ïò×Ô¼ºÕâ¸ö¶ÔÏóµÄ»Øµ÷ ÄÇô¾ÍÊÇÏÂÃæÕâ¸ö·½ÃæÁË
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
System.out.println("ÊÂÎñ¿ªÊ¼...");
// µ÷Óø¸ÀຯÊý
arg3.invokeSuper(arg0, arg2);
System.out.println("ÊÂÎñ½áÊø....");
return null;
}
public static void main(String[] args) {
CglibProxy cglibProxy = new CglibProxy();
AddBookImp oBookImp = (AddBookImp) cglibProxy.getInstance(new AddBookImp());
oBookImp.addbook();
}
}

JDK¶¯Ì¬´úÀí£º

//²Ù×÷¶¨Òå
public interface SubjectOperations {
// ´òÓ¡²Ù×÷
public void print();
// ´òÓ¡ÊäÈë×Ö·û´®²Ù×÷
public void printfStr(String string);
}

public class RealSubject implements SubjectOperations {
@Override
public void print() {
System.out.println("ÎÒʵÏÖÁË½Ó¿Ú Íê³ÉÕâ¸ö´òÓ¡²Ù×÷");
}
@Override
public void printfStr(String string) {
// TODO Auto-generated method stub
System.out.println("´òÓ¡ÊäÈëµÄÄÚÈÝ: " + string);
}
}

public class LogHandler implements InvocationHandler {
private Object ImpClass;
private Object lObject;
public LogHandler(Object realObject) {
this.ImpClass = realObject;
}
public Object bind(Object impclass, Object iObject) {
this.ImpClass = impclass;
this.lObject = iObject;
return Proxy.newProxyInstance(impclass.getClass(). getClassLoader(), impclass.getClass(). getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("ÔÚÄ¿±ê·½·¨µ÷ÓÃǰִÐÐ.....");
method.invoke(ImpClass, args);
System.out.println("ÔÚÄ¿±ê·½·¨µ÷ÓúóÖ´ÐÐ....");
return null;
}
public static void main(String[] args) {
}
}
class Client {
public static void main(String[] args) {
RealSubject subject = new RealSubject();
LogHandler handler = new LogHandler(subject);
// ת»¯³É½Ó¿Ú Ö»ÄÜ´úÀíʵÏÖÁ˽ӿڵÄÀà
SubjectOperations pSubject1 = (SubjectOperations) handler.bind(subject, new LoggerImp());
System.out.println(pSubject1.getClass().getName());
pSubject1.print();
pSubject1.printfStr("YYYYY");
}
}

ÃæÊÔ¹Ù˵ÈÃÄã½²½²IOCºÍAOPʱ£¬ËûÃÇÏëÁ˽âʲô£¿ÎÒÓ¦¸ÃÔõô»Ø´ð

Õâ¸öÎÊÌâÎÒÒ²ºÜÍ·Í´£¬ÕâÀïÎÒÕÒµ½Ò»¸öÄ£°æ£¬ÎÒ´òËãÒÔºó¾ÍÕâÑù»Ø´ð¡£´ó¼ÒÒ²¿ÉÒԲο¼Ò»Ï£º

Öªºõ

ÎҵĻشð£º

SpringÊÇÒ»Ì×ΪÁ˽â¾öÆóÒµÓ¦Óÿª·¢µÄ¸´ÔÓÐÔ¶ø´´½¨µÄ¿ò¼Ü£¬ÌصãÊÇ·Ö²ãµÄ¼Ü¹¹£¬ÔÊÐíÓû§ÔÚ²»Í¬²ãÃæÊ¹Óò»Í¬µÄ×é¼þ½øÐÐ×éºÏ¡£Í¬Ê±Í¨¹ýIOCÈÝÆ÷À´½µµÍñîºÏ£¬¼ò»¯¿ª·¢¡£ÀûÓÃAOPÀ´½øÐÐÇÐÃæ±à³Ìͳһ¹ÜÀíͨÓÃÄ£¿é¡£

ÎÒÔÚ¹¤×÷ÖÐÓõ½¹ýSpringµÄIOCÈÝÆ÷ºÍAOPÃæÏòÇÐÃæ±à³Ì£¬ÔÚÏîÄ¿ÖÐʹÓÃIOCÈÝÆ÷°ïÎҺܺõÄÀíÇå¸÷¸öÒµÎñ¶ÔÏóµÄ¹ØÏµ£¬Í¬Ê±·½±ã²»Í¬×é¼þµÄ¸üÌæ¡£ÔÚ×ö½Ó¿ÚȨÏÞÑé֤ʱ£¬Ê¹ÓÃAOPÇÐÃæ±à³Ì°ïÖúÎÒÄܺܿìµÄ¶ÔÐèÒª½øÐÐÑéÖ¤µÄ½Ó¿ÚÍê³ÉÑéÖ¤¹¦ÄܵÄʵÏÖ¡£²¢ÇÒͳһ½øÐйÜÀí£¬Ìá¸ß¿ª·¢Ð§ÂÊ¡£

SpringMVCµÄ´óÖÂʵÏÖ¹ý³Ì

SpringMVCÇëÇó¹ý³Ì

1.Óû§·¢ÆðÒ»¸örequestÇëÇó£¬Èç¹ûÓжà¸öDispatcherServlet£¬Ôòͨ¹ýServletmappingÈ¥Ö¸¶¨Ö´ÐеÄDispatcherServlet¡£

2.DispatcherServlet°Ñ¸ù¾ÝURLÇëÇó£¬È¥HandlerMappingÖвéÕÒ×¢²áÁ˵ÄURLÓ³É䣬²¢·µ»ØÏàÓ¦µÄHandler£¨Ò»¸öController£¬¶à¸öÀ¹½ØÆ÷£©£¬¸øDispatcherServlet¡£

3.DispatcherServlet´«µÝHandler¸øHandlerAdapterÈ¥Ö´ÐУ¬·µ»ØÒ»¸öModelAndView¡£

4.DispatcherServlet°ÑModelAndView´«µÝ¸øÊÓͼ½âÎöÆ÷È¥½âÎö£¬·µ»ØÒ»¸öÊÓͼview¡£

5.×é×°ÉÏModelÊý¾Ýºó±ä³ÉResponseÇëÇ󷵻ظø¿Í»§¶Ë¡£

SpringIOCºÍAOPÖÐÓõ½µÄÉè¼ÆÄ£Ê½

¼òµ¥¹¤³§

ÔÚSpringÖо­³£ÀûÓÃBeanFactoryµÄgetBean·½·¨È¥»ñÈ¡Bean¾ÍÊÇÒ»¸ö¼òµ¥¹¤³§µÄÉè¼ÆÄ£Ê½µÄʵÏÖ£¬Í¨¹ýBeanµÄIDÈ¥»ñÈ¡Õâ¸ö¶ÔÏóµÄʵÀý¡£BeanµÄIDÒ»°ãÅäÖÃÔÚXMLÎļþÖÐ

¹¤³§·½·¨

ÔÚ¹¤³§·½·¨Ä£Ê½ÖУ¬ Spring²»»áÖ±½ÓÀûÓ÷´Éä»úÖÆ´´½¨bean¶ÔÏó£¬ ¶øÊÇ»áÀûÓ÷´Éä»úÖÆÏÈÕÒµ½FactoryÀ࣬ȻºóÀûÓÃFactoryÔÙÈ¥Éú³Ébean¶ÔÏó¡£

¶øFactory Mothod·½Ê½Ò²·ÖÁ½ÖÖ£¬ ·Ö±ðÊǾ²Ì¬¹¤³§·½·¨ ºÍ ʵÀý¹¤³§·½·¨¡£

¾²Ì¬¹¤³§·½·¨

¶¨ÒåÒ»¸öÀà

public class Car {
private int id;
private String name;
private int price;
//Ê¡ÂÔ¹¹Ô캯Êý getterºÍsetterº¯Êý
}

¶¨ÒåÒ»¸ö¾²Ì¬¹¤³§Àà

public class CarStaticFactory {
private static Map<Integer, Car> map = new HashMap<Integer,Car>();
static{
map.put(1, new Car(1,"Honda",300000));
map.put(2, new Car(2,"Audi",440000));
map.put(3, new Car(3,"BMW",540000));
}
public static Car getCar(int id){
return map.get(id);
}
}

XMLÖеÄÅäÖÃÎļþ£¬¿ÉÒÔ¿´µ½ÎÒÃÇÖ¸¶¨µÄclass²»ÔÙÊǾßÌåµÄBean£¬¶øÊÇÉú²úBeanµÄ¹¤³§£¬È»ºóͨ¹ý¹¤³§·½·¨È¥´´½¨£¬ÓÐÒ»µã²»ºÃµÄµØ·½¾ÍÊÇmapµÄ³õʼ»¯ÔÚ³ÌÐòÖнøÐУ¬ñîºÏ¶ÈÏà¶Ô¸ß

<!--
Static Factory method£º
class: the class of Factory
factory-method: method of get Bean Object
constructor-arg: parameters of factory-method
-->
<bean id="bmwCar" class="com.home.factoryMethod.CarStaticFactory" factory-method="getCar">
<constructor-arg value="3"></constructor-arg>
</bean>
<bean id="audiCar" class="com.home.factoryMethod.CarStaticFactory" factory-method="getCar">
<constructor-arg value="2"></constructor-arg>
</bean>

ʵÀý¹¤³§

ÎÒÃÇ´´½¨Ò»¸ö¹¤³§£¬Õâ´Î»ñÈ¡carµÄ·½·¨²»ÊǾ²Ì¬µÄÁË¡£

public class CarInstanceFactory {
private Map<Integer, Car> map = new HashMap<Integer,Car>();
public void setMap(Map<Integer, Car> map) {
this.map = map;
}
public CarInstanceFactory(){
}
public Car getCar(int id){
return map.get(id);
}
}

XMLÅäÖÃÎļþ£¬°Ñ¹¤³§µÄ³õʼ»¯ÔÚÎļþÖÐÅäÖÃÍê³É¡£²»ÓÃÔÚ´úÂëÖбàд¡£

<!-- Instance Factory Method:
1.must create a bean for the Instance Factroy First
-->
<bean id="carFactory" class="com.home.factoryMethod.CarInstanceFactory">
<property name="map">
<map>
<entry key="4">
<bean class="com.home.factoryMethod.Car">
<property name="id" value="4"></property>
<property name="name" value="Honda"></property>
<property name="price" value="300000"></property>
</bean>
</entry>
<entry key="6">
<bean class="com.home.factoryMethod.Car">
<property name="id" value="6"></property>
<property name="name" value="ford"></property>
<property name="price" value="500000"></property>
</bean>
</entry>
</map>
</property>
</bean>
<!-- 2.use Factory bean to get bean objectr
factory-bean : the bean define above
factory-method: method of get Bean Object
constructor-arg: parameters of factory-method
-->
<bean id="car4" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="4"></constructor-arg>
</bean>
<bean id="car6" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="6"></constructor-arg>
</bean>

 

µ¥Àýģʽ

±£Ö¤Ò»¸öÀà½öÓÐÒ»¸öʵÀý£¬²¢Ìṩһ¸ö·ÃÎÊËüµÄÈ«¾Ö·ÃÎʵ㡣

springÖеĵ¥ÀýģʽÍê³ÉÁ˺ó°ë¾ä»°£¬¼´ÌṩÁËÈ«¾ÖµÄ·ÃÎʵãBeanFactory¡£µ«Ã»Óдӹ¹ÔìÆ÷¼¶±ðÈ¥¿ØÖƵ¥Àý£¬ÕâÊÇÒòΪspring¹ÜÀíµÄÊÇÊÇÈÎÒâµÄjava¶ÔÏó¡£

ÏÂÃæÎÊ´ðÖлáרÃÅ˵һÏÂSpringÖеĵ¥Àýģʽ

ºËÐÄÌáʾµã£ºSpringÏÂĬÈϵÄbean¾ùΪsingleton£¬¿ÉÒÔͨ¹ýsingleton=¡°true|false¡± »òÕß scope=¡°£¿¡±À´Ö¸¶¨

´úÀíģʽ

ΪÆäËû¶ÔÏóÌṩһÖÖ´úÀíÒÔ¿ØÖƶÔÕâ¸ö¶ÔÏóµÄ·ÃÎÊ¡£ ´Ó½á¹¹ÉÏÀ´¿´ºÍDecoratorģʽÀàËÆ£¬µ«ProxyÊÇ¿ØÖÆ£¬¸üÏñÊÇÒ»ÖÖ¶Ô¹¦ÄܵÄÏÞÖÆ£¬¶øDecoratorÊÇÔö¼ÓÖ°Ôð¡£

springµÄProxyģʽÔÚaopÖÐÓÐÌåÏÖ£¬±ÈÈçJdkDynamicAopProxyºÍCglib2AopProxy¡£

¹Û²ìÕßģʽ

¶¨Òå¶ÔÏó¼äµÄÒ»ÖÖÒ»¶Ô¶àµÄÒÀÀµ¹ØÏµ£¬µ±Ò»¸ö¶ÔÏóµÄ״̬·¢Éú¸Ä±äʱ£¬ËùÓÐÒÀÀµÓÚËüµÄ¶ÔÏ󶼵õ½Í¨Öª²¢±»×Ô¶¯¸üС£

springÖÐObserverģʽ³£Óõĵط½ÊÇlistenerµÄʵÏÖ¡£ÈçApplicationListener¡£ServletContextListener

servletºÍFilter³õʼ»¯Ç°ºÍÏú»Ùºó£¬¶¼»á¸øÊµÏÖÁËservletContextListener½Ó¿ÚµÄ¼àÌýÆ÷·¢³öÏàÓ¦µÄ֪ͨ¡£

Ä£°å·½·¨

¶¨ÒåÒ»¸ö²Ù×÷ÖеÄËã·¨µÄ¹Ç¼Ü£¬¶ø½«Ò»Ð©²½ÖèÑÓ³Ùµ½×ÓÀàÖС£Template MethodʹµÃ×ÓÀà¿ÉÒÔ²»¸Ä±äÒ»¸öËã·¨µÄ½á¹¹¼´¿ÉÖØ¶¨Òå¸ÃËã·¨µÄÄ³Ð©ÌØ¶¨²½Öè¡£

Template Methodģʽһ°ãÊÇÐèÒª¼Ì³ÐµÄ¡£ÕâÀïÏëҪ̽ÌÖÁíÒ»ÖÖ¶ÔTemplate MethodµÄÀí½â¡£springÖеÄJdbcTemplate£¬ÔÚÓÃÕâ¸öÀàʱ²¢²»ÏëÈ¥¼Ì³ÐÕâ¸öÀ࣬ÒòΪÕâ¸öÀàµÄ·½·¨Ì«¶à£¬µ«ÊÇÎÒÃÇ»¹ÊÇÏëÓõ½JdbcTemplateÒÑÓеÄÎȶ¨µÄ¡¢¹«ÓõÄÊý¾Ý¿âÁ¬½Ó£¬ÄÇôÎÒÃÇÔõô°ìÄØ£¿ÎÒÃÇ¿ÉÒ԰ѱ仯µÄ¶«Î÷³é³öÀ´×÷Ϊһ¸ö²ÎÊý´«ÈëJdbcTemplateµÄ·½·¨ÖС£µ«ÊDZ仯µÄ¶«Î÷ÊÇÒ»¶Î´úÂ룬¶øÇÒÕâ¶Î´úÂë»áÓõ½JdbcTemplateÖеıäÁ¿¡£Ôõô°ì£¿ÄÇÎÒÃǾÍÓûص÷¶ÔÏó°É¡£ÔÚÕâ¸ö»Øµ÷¶ÔÏóÖж¨ÒåÒ»¸ö²Ù×ÝJdbcTemplateÖбäÁ¿µÄ·½·¨£¬ÎÒÃÇȥʵÏÖÕâ¸ö·½·¨£¬¾Í°Ñ±ä»¯µÄ¶«Î÷¼¯Öе½ÕâÀïÁË¡£È»ºóÎÒÃÇÔÙ´«ÈëÕâ¸ö»Øµ÷¶ÔÏóµ½JdbcTemplate£¬´Ó¶øÍê³ÉÁ˵÷Óá£Õâ¿ÉÄÜÊÇTemplate Method²»ÐèÒª¼Ì³ÐµÄÁíÒ»ÖÖʵÏÖ·½Ê½°É¡£

²»Óü̳еÄÄ£°æ·½·¨

ÎÒÃǰÑÏëÒªµÄconnectionÁ¬½Ó¸³Öµµ½»Øµ÷¶ÔÏóÖÐ

»ñÈ¡´ÓJDBCTemplateÖд«ÈëµÄÎȶ¨µÄConnection¶ÔÏ󣬽øÐÐ×Ô¼º¶¨ÒåµÄ²Ù×÷

¼Ì³ÐµÄÄ£°æ·½·¨£¬±ÈÈç³£¼û

ÎÒÃǶ¨ÒåÒ»¸öËã·¨µÄÖ´Ðйý³Ì£¬ÀïÃæ»áµ÷ÓÃ4¸öС²½Ö裬¾ßÌåµÄС²½ÖèµÄʵÏÖÎÒÃǽ»¹ýʵÏÖµÄ×ÓÀàÈ¥Íê³É¡£È»ºóÓû§µ÷ÓÃÕû¸öprocess·½·¨¾ÍÄÜʵÏÖ¹¦ÄÜ¡£

public abstract class EntityProcessor {
public final void processEntity() {
getEntityData();
createEntity();
validateEntity();
persistEntity();
}
protected abstract void getEntityData();
protected abstract void createEntity();
protected abstract void validateEntity();
protected abstract void persistEntity();
}

 

IOC µÄµ¥ÀýģʽÊÇÔõôʵÏÖµÄ

IOCµÄµ¥Àýģʽ²»ÊÇʹÓõÄÀÁººÊ½»òÕß¶öººÊ½£¬Ê¹ÓõÄÊÇ

µ¥Àý×¢²á±í£¬Í¨¹ý°ÑBeanµÄÃû³ÆºÍ¶ÔÏó×é³ÉµÄkey-value×¢²á½øHashMapÖС£Ã¿´ÎÐèÒª»ñÈ¡ÏàÓ¦µÄÀàʱ£¬¸ù¾ÝÃû³ÆÈ¥»ñÈ¡£¬Èç¹ûûÓÐÕâ¸öbean¾ÍÈ¥¶ÁÈ¡BeanµÄ¶¨Òå¡£¹À¼ÆtypeÊÇÐèÒªµ¥Àý»¹ÊǶàÀý£¬Èç¹ûÊǵ¥Àý×¢²á½øÈë±í²¢·µ»Ø£¬ÈçÊǶàÀý²»×¢²á£¬´´½¨Ò»¸öBean²¢·µ»Ø¡£

public abstract class AbstractBeanFactory implements ConfigurableBeanFactory{
/**
* ³äµ±ÁËBeanʵÀýµÄ»º´æ£¬ÊµÏÖ·½Ê½ºÍµ¥Àý×¢²á±íÏàͬ
*/
private final Map singletonCache=new HashMap();
public Object getBean(String name)throws BeansException{
return getBean(name,null,null);
}
...
public Object getBean(String name,Class requiredType,Object[] args)throws BeansException{
//¶Ô´«ÈëµÄBean nameÉÔ×ö´¦Àí£¬·ÀÖ¹´«Èë µÄBean nameÃûÓзǷ¨×Ö·û(»òÔò×öתÂë)
String beanName=transformedBeanName(name);
Object bean=null;
//ÊÖ¹¤¼ì²âµ¥Àý×¢²á±í
Object sharedInstance=null;
//ʹÓÃÁË´úÂëËø¶¨Í¬²½¿é£¬Ô­ÀíºÍͬ²½·½·¨ÏàËÆ£¬ µ«ÊÇÕâÖÖд·¨Ð§Âʸü¸ß
synchronized(this.singletonCache){
sharedInstance=this.singletonCache.get (beanName);
}
if(sharedInstance!=null){
...
//·µ»ØºÏÊʵĻº´æBeanʵÀý
bean=getObjectForSharedInstance(name, sharedInstance);
}else{
...
//È¡µÃBeanµÄ¶¨Òå
RootBeanDefinition mergedBeanDefinition=getMergedBeanDefinition (beanName,false);
...
//¸ù¾ÝBean¶¨ÒåÅжϣ¬´ËÅжÏÒÀ¾Ýͨ³£À´×ÔÓÚ×é¼þÅäÖÃÎļþµÄµ¥ÀýÊôÐÔ¿ª¹Ø
//<bean id="date" class="java.util.Date" scope="singleton"/>
//Èç¹ûÊǵ¥Àý£¬×öÈçÏ´¦Àí
if(mergedBeanDefinition.isSingleton()){
synchronized(this.singletonCache){
//Ôٴμì²âµ¥Àý×¢²á±í
sharedInstance=this.singletonCache.get(beanName);
if(sharedInstance==null){
...
try {
//ÕæÕý´´½¨BeanʵÀý
sharedInstance=createBean(beanName, mergedBeanDefinition,args);
//Ïòµ¥Àý×¢²á±í×¢²áBeanʵÀý
addSingleton(beanName,sharedInstance);
}catch (Exception ex) {
...
}finally{
...
}
}
}
bean=getObjectForSharedInstance (name,sharedInstance);
}
//Èç¹ûÊǷǵ¥Àý£¬¼´prototpye£¬Ã¿´Î¶¼ÒªÐ´´½¨Ò»¸öBeanʵÀý
//<bean id="date" class="java.util.Date" scope="prototype"/>
else{
bean=createBean(beanName,mergedBeanDefinition,args);
}
}
...
return bean;
}
}

 

ÈçºÎ±£Ö¤IOCÖÐÓÐ״̬BeanµÄḬ̈߳²È«

ÓÐ״̬Bean¾ÍÊÇһЩBeanʵÀýÖк¬ÓÐһЩ·ÇḬ̈߳²È«µÄ³ÉÔ±±äÁ¿£¬ÄÇôµ±¶à¸öÏß³Ìȥͬʱ²Ù×÷Õâ¸öBeanʱ£¬¾ÍÓпÉÄܵ¼Ö¶ÔÕâЩ±äÁ¿µÄ²Ù×÷³öÏÖÎÊÌâ¡£

ʹÓÃThreadLocalÀà¿ÉÒÔ×öµ½£¬ThreadLocal»áΪ±äÁ¿ÔÚÿ¸öÏß³ÌÖд´½¨±¾µØ±äÁ¿¸±±¾£¬ÄÇôÿ¸öÏ߳̿ÉÒÔ·ÃÎÊ×Ô¼ºÄÚ²¿µÄ¸±±¾±äÁ¿¡£´ó¼Ò»¥²»¸ÉÈÅ£¬ÒÔ´Ë´ïµ½Ḭ̈߳²È«µÄÄ¿µÄ¡£

×î³£¼ûµÄÊý¾Ý¿âÁ¬½Ó¹ÜÀíÀࣺ

class ConnectionManager {
private static Connection connect = null;
public static Connection openConnection() {
if(connect == null){
connect = DriverManager.getConnection();
}
return connect;
}
public static void closeConnection() {
if(connect!=null)
connect.close();
}
}

 

µÚÒ»£¬ÕâÀïÃæµÄ2¸ö·½·¨¶¼Ã»ÓнøÐÐͬ²½£¬ºÜ¿ÉÄÜÔÚopenConnection·½·¨Öлá¶à´Î´´½¨connect£»µÚ¶þ£¬ÓÉÓÚconnectÊǹ²Ïí±äÁ¿£¬ÄÇô±ØÈ»ÔÚµ÷ÓÃconnectµÄµØ·½ÐèҪʹÓõ½Í¬²½À´±£ÕÏḬ̈߳²È«£¬ÒòΪºÜ¿ÉÄÜÒ»¸öÏß³ÌÔÚʹÓÃconnect½øÐÐÊý¾Ý¿â²Ù×÷£¬¶øÁíÍâÒ»¸öÏ̵߳÷ÓÃcloseConnection¹Ø±ÕÁ´½Ó¡£

ʹÓÃThreadLocalºó£º

µ±¶à¸öÏß³ÌȥȡsessionµÄʱºò£¬¶¼»áÈ¥ÄÃ×Ô¼ºÏ̵߳ı¾µØ±äÁ¿¸±±¾£¬Ã»Óоʹ´½¨Ò»¸ö×¢²á½øÈ¥²¢·µ»Ø¡£

private static final ThreadLocal threadSession = new ThreadLocal();
public static Session getSession() throws InfrastructureException {
Session s = (Session) threadSession.get();
try {
if (s == null) {
s = getSessionFactory().openSession();
threadSession.set(s);
}
} catch (HibernateException ex) {
throw new InfrastructureException(ex);
}
return s;
}

¾ÙÀý˵Ã÷IOCÈçºÎʹÓã¬AOPÈçºÎʹÓÃ

IOCµÄʹÓãº

Ê×Ïȶ¨ÒåÄãÐèÒªµÄBeanµÄÀàÒÔ¼°³ÉÔ±±äÁ¿£¬È»ºó½«ÕâЩÀàÈ«²¿×¢²áµ½SpringµÄApplicationContext.xmlÎļþÖУ¬È»ºóÔÚxmlÎļþ½ø½øÐÐÒÀÀµÅäÖá£Ö®ºóÖ»ÐèÒªÔÚ³ÌÐòÖд´½¨Ò»¸öBeanFactory£¬¼ÓÔØXMLÎļþ£¬getBean¾ÍÄÜ»ñµÃÎÒÃÇÒªµÄʵÀýÁË

AOPʹÓÃAspectj£º

¶¨ÒåÒ»¸öAdviceÀ࣬ÀïÃæ½øÐÐÒ»¸ö»ò¶à¸öpointcutµÄ¶¨Ò壬ÒÔ¼°ÔÚÄĸöpointcutÏÂʹÓÃÄÇЩ·½·¨£¬

¶¨ÒåµÄpointcut·½·¨±¾ÉíÖ»ÊÇÓÃÀ´±ê¼ÇµÄ£¬ÓÃÓÚÖ¸¶¨ÔÚÄÄÀï½øÐÐÒ»¸öÇÐÈ룬±ÈÈçÕâÀïÎÒʹÓõÄÊÇwithin´ú±íÇÐÈëNeedLogServiceÀàÖеÄËùÓз½·¨

¶¨ÒåÒ»¸öpointcut

ÓÐÖ´ÐÐǰµÄ£¬ÓÐÖ´ÐкóµÄ£¬ÓÐÒ쳣ʱµÄ

¶¨ÒåÇÐÃæ·½·¨

µ±ÎÒÃǵ÷ÓÃÕâ¸öÀàµÄ·½·¨Ê±£¬¾Í»á·¢ÏÖ±»ÔöÇ¿ÁË

±»´úÀíÀඨÒå

²âÊÔµ÷ÓÃ

Êä³ö

 
   
3243 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö