标签:
spring有两大特性,其一为ioc,其二为aop
1.ioc的理解
ioc为依赖注入,他的好处就是把创建对象的权利交给spring去管理,这样的好处是 将应用程序中的对象解耦,传统的方式程序中的对象与对象引用的对象相互依赖,这样就使得依赖性增高,增加耦合性。
解耦举例:
不使用spring:action层中引用service,servicebean需要new一个实例。这样action和servicebean层耦合的。
使用spring:action层中引用service,servicebean只需声明即可,实例化是在spring容器内进行的,这样action和service层是解耦的
di为控制反转,以前创建对象的权利由应用程序,现在交给spring来管理 从应用层到ioc这就为控制反转。
ioc提供了两种容器:
1)bean工厂(BeanFactory),采用工厂模式,负责创建和分发bean对象,bean工厂还参与到bean的生命周期中,调用用户定义的初始化方法和销毁方法。
bean工厂延迟加载所有bean,知道getBean方法被调用时才创建bean
2)应用上下文(ApplicationContext)建立在bean工厂之上,提供了系统架构服务。
BeanFactory factory=(BeanFactory)context;
下边重点说一些bean的生命周期
关于bean的一些内容
package com.mediaforce.crawl.aop; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SystemServiceLog { String description() default ""; }
1 package com.mediaforce.crawl.aop; 2 3 import java.lang.reflect.Method; 4 import java.util.ArrayList; 5 import java.util.Arrays; 6 import java.util.Date; 7 import java.util.List; 8 9 import javax.annotation.Resource; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpSession; 12 13 import org.aspectj.lang.JoinPoint; 14 import org.aspectj.lang.annotation.After; 15 import org.aspectj.lang.annotation.Aspect; 16 import org.aspectj.lang.annotation.Before; 17 import org.aspectj.lang.annotation.Pointcut; 18 import org.slf4j.Logger; 19 import org.slf4j.LoggerFactory; 20 import org.springframework.stereotype.Component; 21 import org.springframework.web.context.request.RequestContextHolder; 22 import org.springframework.web.context.request.ServletRequestAttributes; 23 24 import com.mediaforce.crawl.model.Listpage; 25 import com.mediaforce.crawl.model.TaskLog; 26 import com.mediaforce.crawl.model.Websource; 27 import com.mediaforce.crawl.service.CrawlService; 28 import com.mediaforce.crawl.service.TaskLogService; 29 30 @Aspect 31 @Component 32 public class SystemLogAspect { 33 @Resource 34 private TaskLogService taskLogService; 35 36 @Resource 37 private CrawlService crawlService; 38 39 private static final Logger logger = LoggerFactory 40 .getLogger(SystemLogAspect.class); 41 42 // 层切入点 43 @Pointcut("@annotation(com.mediaforce.crawl.aop.SystemServiceLog)") 44 public void serviceAspect() { 45 } 46 47 48 @Before("serviceAspect()") 49 public void doBefore(JoinPoint joinPoint){ 50 logger.error("=====日志前置通知开始====="); 51 52 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder 53 .getRequestAttributes()).getRequest(); 54 HttpSession session = request.getSession(); 55 // 读取session中的用户 56 String username = (String) session.getAttribute("username"); 57 58 try{ 59 String action=""; 60 String msg=""; 61 String description =getServiceMthodDescription(joinPoint); 62 63 Object[] args = joinPoint.getArgs(); 64 65 if("删除网站资源".equals(description)){ 66 action="删除网站资源"; 67 msg=this.getMsg(args, description); 68 }else if("删除列表页".equals(description)){ 69 action="删除列表页"; 70 msg=this.getMsg(args, description); 71 }else if("增加或者修改列表页".equals(description)){ 72 Listpage lptemp=(Listpage) args[0]; 73 if(lptemp.getId()==null){ 74 action="增加列表页"; 75 msg=lptemp.getUrl(); 76 } 77 action ="修改列表页"; 78 msg=this.getMsg(args, description); 79 }else if("增加或者修改网站资源".equals(description)){ 80 Websource wstemp=(Websource) args[0]; 81 if(wstemp.getId()==null){ 82 action="增加网站资源"; 83 msg=wstemp.getUrl(); 84 } 85 action ="修改网站资源"; 86 msg=this.getMsg(args, description); 87 } 88 89 90 91 TaskLog taskLog = new TaskLog(); 92 taskLog.setMsg(msg); 93 taskLog.setAction(action); 94 taskLog.setCreatetime(new Date()); 95 taskLog.setStatus(username); 96 taskLog.setTaskid(1l); 97 98 session.setAttribute("tasklog", taskLog); 99 // taskLogService.saveOrUpdateTaskLog(taskLog); 100 101 }catch(Exception e){ 102 e.printStackTrace(); 103 logger.error("=====日志前置通知异常====="); 104 } 105 } 106 @After("serviceAspect()") 107 public void doAfter(JoinPoint joinPoint){ 108 logger.error("=====日志后置通知开始====="); 109 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder 110 .getRequestAttributes()).getRequest(); 111 HttpSession session = request.getSession(); 112 TaskLog taskLog = (TaskLog) session.getAttribute("tasklog"); 113 taskLogService.saveOrUpdateTaskLog(taskLog); 114 logger.error("=====日志后置通知结束====="); 115 } 116 117 118 /** 119 * 获取msg详细信息 120 * @param tempIds 121 * @param s 122 * @return 123 */ 124 public String getMsg(Object[] o,String s){ 125 List<Long> ids = new ArrayList<Long>(); 126 127 if(s.contains("网站资源")){ 128 if(s.contains("删除")){ 129 Long[] temp=(Long[]) o[0]; 130 ids=Arrays.asList(temp); 131 }else{ 132 Websource ws=(Websource) o[0]; 133 ids.add(ws.getId()); 134 } 135 136 List<Websource> list=crawlService.getWebsources(ids); 137 StringBuffer names=new StringBuffer(); 138 for(Websource w:list){ 139 names=names.append(w.getName()).append(":").append(w.getUrl()).append(";"); 140 } 141 return names.toString(); 142 143 }else { 144 if(s.contains("删除")){ 145 Long[] temp=(Long[]) o[0]; 146 ids=Arrays.asList(temp); 147 }else{ 148 Listpage lp=(Listpage) o[0]; 149 ids.add(lp.getId()); 150 } 151 152 List<Listpage> list = crawlService.getListPages(ids); 153 StringBuffer names=new StringBuffer(); 154 for(Listpage w:list){ 155 names.append(w.getUrl()).append(";"); 156 System.out.println(names); 157 } 158 return names.toString(); 159 } 160 161 162 } 163 164 /** 165 * 获取注解中对方法的描述信息 166 * 167 * @param joinPoint 168 * @return 169 * @throws Exception 170 */ 171 172 public static String getServiceMthodDescription(JoinPoint joinPoint) 173 throws Exception { 174 String targetName = joinPoint.getTarget().getClass().getName(); 175 String methodName = joinPoint.getSignature().getName(); 176 Object[] arguments = joinPoint.getArgs(); 177 Class targetClass = Class.forName(targetName); 178 Method[] methods = targetClass.getMethods(); 179 String description = ""; 180 for (Method method : methods) { 181 if (method.getName().equals(methodName)) { 182 Class[] clazzs = method.getParameterTypes(); 183 if (clazzs.length == arguments.length) { 184 description = method.getAnnotation(SystemServiceLog.class) 185 .description(); 186 break; 187 } 188 } 189 } 190 return description; 191 } 192 193 }
标签:
原文地址:http://www.cnblogs.com/amei0/p/4673344.html