±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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
ÓÐÖ´ÐÐǰµÄ£¬ÓÐÖ´ÐкóµÄ£¬ÓÐÒ쳣ʱµÄ

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

±»´úÀíÀඨÒå

²âÊÔµ÷ÓÃ

Êä³ö
|