菜单

澳门金沙投注官网Spring框架之IoC和AOP

2019年5月12日 - 金沙前端

Spring框架简单介绍:

200三年6月,Spring框架正式成为二个开源项目,并发表于SourceForge中。致力于Java
EE应用的种种解决方案,而并不是单独专注于某1层的方案,是公司应用开垦的“一站式”选用。贯穿表现层,业务层,持久层,并不代表已有些框架,而是以万丈的开放性与它们无缝结合。

注:首先通过Spring官方网址的地点

Spring IoC:

Ioc:调整反转,也叫做注重注入,是面向对象的一种设计思想,用来下滑程序代码之间的耦合度。
决定反转(信赖注入):容器(如Spring)负担把组件所依赖的具体目的注入(赋值)给组件,从而防止以硬编码的措施耦合在一块。

使用Ioc注入:

导入所需jar包,成立spring主题配置文件:

<?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:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    ">

</beans>

壹.设值注入:

1     <bean id = "helloSpring" class="cn.demo.HelloSpring">
2         <property name="str" value="Spring"></property>
3     </bean>

id:为其钦定1个用来访问的唯一名称,假若想钦定越来越多的外号,能够透过name属性,用逗号,分号,空格举行分隔。

class:要注入的类的通通限定名。

property:

    name:属性的setter的法子名,所以利用设值注入必须提供setter方法。

    value:赋给属性的值。

二.构造注入:使用构造方法进行赋值。

1     <bean id="user" class="cn.bdqn.pojo.User">
2         <constructor-arg index="0" name="id" value="1"  type="integer"></constructor-arg>
3         <constructor-arg index="1" name="name" value="Spring"></constructor-arg>
4     </bean>

constructor-arg:表示构造方法的一个参数,使用时不区分顺序。
  index:参数的下标。(下标从0开始)
  name:参数的名称。
  value:赋予参数的值。
  type:参数的类型。
使用时,无需全部指定以上属性。根据需求选择属性进行注入。

三.应用p命名空间达成属性注入:

<bean id="userDao" class="cn.dao.imp.UserDaoImp"></bean>    
<bean id="user" class="cn.pojo.User" p:id="1" p:name="Spring"  p:dao-ref="userDao"></bean>

  p:属性名 = “属性值”

  p:属性名-ref = “Bean的id”

动用p命名空间实现注入,也是因此质量的setter方法进行注入。必须提供该属性的setter方法。

测试注入的结果:(编写测试类)

 1 package cn.test;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 import cn.bdqn.pojo.User;
 6 import cn.bdqn.service.IUserService;
 7 import cn.bdqn.service.imp.UserServiceImp;
 8 
 9 
10 public class test {
11     public static void main(String[] args) {
12         ApplicationContext c = new ClassPathXmlApplicationContext("app.xml");//读取Spring核心配置文件
13     User user = (User) c.getBean("user");//通过bean的id获取该类的实例对象
14         //输出类注入的属性值。例:user.getName();//读取user类中name的值。
15     }
16 }

在Spring中,bean能够被定义为三种形式:prototype(多例)和singleton(单例)

singleton(单例):惟有一个共享的实例存在,全体对那一个bean的恳求都会回去那个唯一的实例。

prototype(多例):对那一个bean的每趟请求都会创设两个新的bean实例,类似于new。

Spring bean 暗中认可是单例情势。能够透过 scope=”prototype”  修改为多例方式。

<bean id="user" class="cn.pojo.User" scope="prototype">

 

流入差别的数据类型:

一.注入直接量(基本数据类型、字符串):

对于着力数据类型,及其包装类、字符串,除了能够选取value属性,还是能够通过<value>子成分实行注入。

1 <property name = "name">
2         <value>张三</value>
3 </property>

假如属性值中蕴涵了XML中的特殊字符(&、<、>、”、’)则注入时索要管理:

  1.使用<[!CDATA[]]>标记

1 <property name = "name">
2      <value><![CDATA[P&G]]></value>
3  </property>

  二.把特殊字符替换为实体引用。

1 <property name = "name">
2      <value>P&amp;G</value>
3  </property>

XML预订的实体引用:

  < :&It;     > :>   &:&  ‘:'  ” :"

注:XML中仅有 < 和 &
是不法的,其余多个是合法的,不过替换为实体引用是个好习贯。

二.引用其余Bean组件:

Spring中定义的Bean能够互相引用,从而确立信赖关系,除了利用ref属性,还是能透过<ref>子成分实现。

<property name = "dao">
        <!--  引用id为userDao的对象为userService的dao属性赋值  -->
        <ref bean = "userDao">
</property>

<property name = "dao">
        <!--  引用id为userDao的对象为userService的dao属性赋值  -->
        <ref local= "userDao">
</property>

local属性和bean属性的用法差不多千篇1律,都是用来钦赐要引用Bean的id。不同在于,Spring配置文件是能够拆分四个的。使用local属性只可以在同二个配置文件中寻觅id,而选取bean属性能够在任何计划文件中检索bean的id。

三.运用在那之中Bean:

只要1个Bean组仅在1处索要采用,能够把它定义为当中Bean。

<!--  为userService的dao属性赋值,调用的是serDao方法 -->
<property name = "dao">
 <!--  定义userDao对象(这个userDaoImp只能被这个userService使用,无法被其他的Bean调用) -->
 <bean class="dao.imp.UserDaoImp"/>
</property>

四.流入集结类型的品质:

  壹.注List照旧数组类型的天性,可以接纳<list>标签注入。

<property name = "list">
    <list>
        <!-- 定义list或数组中的元素 -->
            <value>集合1</value>
            <value>集合2</value>
    </list>        
</property>

注:list标签中能够选拔value、ref等标签进行注入集合成分,乃至是3个list标签。  

  2.对于set,能够接纳set标签进行注入。

<property name = "set">
    <set>
        <!-- 定义set中的元素 -->
            <value>集合1</value>
            <value>集合2</value>
    </set>        
</property>

注:set标签中能够利用value、ref等标签进行注入集合成分。

  三.对此Map类型的习性。

 1 <property name = "map">
 2     <map>
 3         <!-- 定义map中的键值对 -->
 4             <entry>
 5                 <key><value>map的键1</value></key>
 6                 <value>map的值1</value>
 7             </entry>
 8 
 9             <entry>
10                 <key><value>map的键2</value></key>
11                 <value>map的值2</value>
12             </entry>
13     </map>        
14 </property>

注:假若map中的键恐怕值是Bean对象,能够把上述代码中的value换成ref。

  四.对此Properties类型的特性。

<property name = "prop">
    <props>
        <!-- 定义Properties中的元素 -->
            <prop key = "键1">值1</prop>
            <prop key = "键2">值2</prop>
    </props>        
</property>

注:Properties中的键和值一般都是字符串类型。

  伍.流入null和空字符串值

<!-- 注入空字符串值 -->
<property name = "id"><value></value></property>

<!-- 注入null值 -->
<property name = "name"><null/></property>

Spring AOP:

面向切面编制程序:是软件编制程序观念升华到早晚的品级的产物。是面向对象的有利补充。一般用来全体横切逻辑的场馆,如限制调节、事务管理、品质检验等。面向切面一言以蔽之正是在不改造源程序的底蕴上为代码段增添部分新的成效,对代码段实行抓实管理。设计观念根源代理设计情势。

断面(Aspect):叁个模块化的横切逻辑(或横切关切点),可能会横切多个指标。

连接点(Join Point):通过连接点找到切点的地方。

压实管理(Advice):撒布在系统中的公共职能。日志管理 事务管理。

切入点(Pointcut):加强的代码供给放入的职位。

对象对象(Target object):被三个或多少个断面加强的对象.

AOP代理(AOP proxy):由AOP框架所创制的靶子,达成推行加强处理方法等作用。

织入(Weaving):将加强处理代码连接到应用程序中的类型或对象的经过。

增进类型处理:前置加强、前置巩固、环绕加强、卓殊抛出增进、最后进步级门类。

注:切面能够清楚成由加强管理和切入点的3结合,既包蕴了横切逻辑的概念,也包蕴了连接点的概念。面向切面编制程序重要关怀七个难题,三个是在怎么岗位,2是奉行什么样功能。Spring
AOP是承担执行切面包车型大巴框架。即由AOP完成织入专业。

一.选用AOP进行坚实管理:

  壹.定义加强类:     

 1 package cn.bdqn.advice;
 2 
 3 import org.apache.log4j.Logger;
 4 import org.aspectj.lang.JoinPoint;
 5 import org.aspectj.lang.ProceedingJoinPoint;
 6 
 7 public class ServiceLoggingAdvice {
 8     private Logger logger = Logger.getLogger(ServiceLoggingAdvice.class);
 9     
10     //前置增强
11     public void before(JoinPoint joinPoint){
12         String methodName = joinPoint.getSignature().getName();//获得增强的方法名
13         String className = joinPoint.getTarget().getClass().getSimpleName();//获得增强的类名
14         logger.debug("前置增强。。。。");
15     }
16     
17     
18     //后置增强
19     public void after(JoinPoint joinPoint){
20         String methodName = joinPoint.getSignature().getName();//获得增强的方法名
21         String className = joinPoint.getTarget().getClass().getSimpleName();//获得增强的类名
22         logger.debug("后置增强。。。。");
23     }
24     
25     //异常增强
26     public void thowing(Exception e){
27         logger.debug(e.getMessage());
28     }
29     
30     //最终增强
31     public void afterEnd(JoinPoint joinPoint){
32         String methodName = joinPoint.getSignature().getName();//获得增强的方法名
33         String className = joinPoint.getTarget().getClass().getSimpleName();//获得增强的类名
34         logger.debug("最终增强");
35     }
36 
37     //环绕增强
38     public Object round(ProceedingJoinPoint joinPoint){
39         Object result = null;
40         try {
41             logger.debug("环绕增强----前置");
42             result = joinPoint.proceed();
43             logger.debug("环绕增强---后置");
44         } catch (Throwable e) {
45             e.printStackTrace();
46         }
47         return result;
48     }
49 }

 

注:通过JoinPoint连接点能够取得指标措施的有关音讯,如所在类,方法名,方法的走访修饰符等音讯。

围绕加强方法注解ProceedingJoinPoint类型的参数,能够获得连接点的音讯,方法与JoinPoint相同。是JoinPoint的子接口,其不但封装目的措施,以及目的参数,还包裹了被代理的目的对象,通过它的proceed()方法能够调用真正的靶子措施,从而达成对连接点的一点一滴调控。

  贰.Spring配置文件举行AOP相关配置:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans
 3     xmlns="http://www.springframework.org/schema/beans"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5     xmlns:p="http://www.springframework.org/schema/p"
 6     xmlns:aop="http://www.springframework.org/schema/aop"
 7     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 8     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 9     http://www.springframework.org/schema/aop 
10     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
11     ">
12 
13     <!-- AOP -->
14    <!-- 增强类 --> <bean id="advice" class="cn.bdqn.advice.ServiceLoggingAdvice"></bean>
15     <aop:config>
16         <aop:pointcut expression="execution(* cn.bdqn.service..*.*(..))" id="point"/>
17         <aop:aspect ref="advice">
18         
19 <!--     前置增强      <aop:before method="before"  pointcut-ref="point" /> -->
20 <!--     异常抛出增强   <aop:after-throwing method="afterThrowing" pointcut-ref="point" throwing="e"/> -->
21 <!--     最终增强      <aop:after method="afterEnd" pointcut-ref="point"/> -->
22 <!--     后置增强      <aop:after-returning method="after" pointcut-ref="point"/> -->
23 <!--     环绕增强      <aop:around method="around" pointcut-ref="point"/> -->
24         </aop:aspect>
25     </aop:config>
26 </beans>

  一.松开巩固:使用<aop:before>进行停放加强,在对象措施前实行。

  二.前置巩固:使用<aop:after-returning>进行前置巩固,在目的措施之后实践。(倘若目的措施出现极度,无论是还是不是使用try-catch捕获,前置巩固都不会施行)

  三.特出抛出增加:使用<aop:after-throwing>进行非常抛出增加,在对象措施抛出特别时,织入加强代码。

  四.聊起底提升:使用<aop:after>进行最终提升。(假如目的措施出现非常,无论是不是使用try-catch捕获,最后升高都会奉行)

  5.缠绕巩固:使用<aop:round>实行环绕加强,在对象措施前后都得以织入巩固管理。功效最佳强劲的拉长管理项目,Spring把对象措施的调控权全体付给了它,环绕巩固管理中,能够博得或然涂改指标措施的参数,再次来到值,能够举行丰硕管理,甚至足以决定目的措施是或不是被施行。

注:配置切入点的价签<aop:pointcut>的expression的质量可以配备切入点的表明式:

  execution是切入点的提示符。括号里是切入点的表明式,能够配备切入加强的管理格局的表征,也协理模糊查询:

    1.public * addNewUser(entity.User):  *
表示卓越全体类型的重临值。

    2.public void *澳门金沙投注官网,(entity.User): * 表示相当全数的方法名。

    三.public void addNewUser(..):  “..” 表示具有参数个数和连串。

    4.* com.service.*.*(..):
这么些表达式表示相称com.service包下的全数类的持有办法。

    5.* com.service..*金金沙澳门官网网址,.*(..):
这一个表达式表示相称com.service包以及其子包下全部类的兼具办法。

<aop:aspect>标签引用包含增强方法的Bean,然后通过各种增强标签进行增强处理。
  method:表示增强类中的某个方法。
  pointcut-ref:引入增强的切入点。
----异常增强中的 throwing属性代表异常的参数名。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图