zoukankan      html  css  js  c++  java
  • spring2.5

    1:IOC:控制反转,不再把依赖对象交给应用本身创建和维护,而是交给外部容器创建和维护。这样控制权由应用转移到外部容器。
    2:DI:依赖注入,在运行期,由外部容器动态的将依赖对象注入到组件中,可以通过构造函数的参数形式注入,也可以通过set方法注入。 

    3:为何要使用Spring
    a.降低组件之间的耦合度,实现软件各层之间的解耦
    Controller---Service---Dao
    b.可以使用容器提供的各种服务,不需要处理复杂的事物传播行为
    事务管理
    c.容器提供单例模式,开发人员不需要自己编写实现代码
    d.容器提供AOP技术,利用它很容易实现如权限拦截,运行期监控等功能。
    e.容器提供了众多的辅佐类,使用这些类能够加快应用的开发,
    如:jdbcTemplate、HibernateTemplate.
    d.Spring对于主流的应用框架提供了集成支持,
    如:集成hibernate、JPA、Structs 等,这样更便于应用的开发

    4:轻量级与重量级概念的划分
    主要看它使用了多少服务


    如何使用spring?
    使用spring需要的jar包
    添加配置文件beans.xml,加入<bean id = "" class = "需要注入的类的路径"></bean>
    ApplicationContext ctx =
    new ClassPathXmlApplicationContext(String []{"beans.xml"})
    ctx.getBean("配置文件中需注入类的class属性")
    这样就可以得到我们所依赖的对象了,这个依赖对象由spring帮我们管理

    Spring是如何读取beans.xml的?

    Bean的作用域
    scope=""
    1.singleton 默认
    容器实例化时对象被实例化,只创建一个对象
    2.pototype
    调用getBean()方法时被实例化,每次都会创建一个新对象

    我们可以延迟实例化
    在<bean>中加上 lazy-init = "true"
    如果我们要将所有的bean都延迟实例化 就在<beans>中加入
    default-lazy-init = "true"
    如果需要当<bean>被实例化时就执行方法 就在<bean>中加入init-method = "方法名"
    看一个对象是否被实例化,在他的默认构造方法中输出一句话 看看构造方法是否被调用

    当我们需要关闭容器时执行某个方法,在bean中加入 destroy-method="方法名"

    使用setter方法进行注入:
    要将service层和dao层彻底解耦,我们需要将dao实现类所实现的接口直接注入到service
    层,然后提供set、get方法,直接可以用注入的接口调用方法,在beans.xml中注入接口
    的实现类,然后将它注入到service层的bean中作为属性,
    <property name="personDao1" ref="personDao1" ></property>
    name="属性名"

    事实上是:先将PersonDaoBean注入到spring容器中,然后再将注入到spring容器中的
    PersonDaoBean作为属性注入到PersonServiceBean中作为属性,命名为personDao,事实
    上personDao本来就是PersonServiceBean的属性,所以啊,通过这么一来 就把
    PersonDaoBean注入到PersonServiceBean中了 ,那么这时候PersonServiceBean
    通过personDao就可以调用PersonDaoBean中的方法了。如此而已。 注意哦:这样注入就不要再提供带参构造方法了!!!

    例子:

    1  <bean id = "studentDao" class = "Student.Dao.Impl.StudentDaoImpl"></bean>
    2 <bean id = "studentServiceBean" class = "Student.Service.StudentServiceBean">
    3 <property name="studentDao" ref="studentDao"></property>
    4 </bean>





    还可以使用内部Bean方式为属性注入值,但不能被其他调用
    像这样:

    1 <property name="studentDao">
    2 <bean class="Student.Dao.Impl.StudentDaoImpl"/>
    3 </property>

    注入基本类型:<property name="属性名" value="属性值"/> 定义一个变量,
    然后生成get、set方法,

    注入集合:

     1 <property name="set">
     2 <set>
     3 <value></value>
     4 <value></value>
     5 <value></value>
     6 </set>
     7 </property>
     8 <property name="list">
     9 <list>
    10 <value>一list</value>
    11 <value>二list</value>
    12 <value>三list</value>
    13 </list>
    14 </property>
    15 <property name="map">
    16 <map>
    17 <entry key="key1" value="v1"></entry>
    18 <entry key="key2" value="v2"></entry>
    19 <entry key="key3" value="v3"></entry>
    20 </map>
    21 </property>
    22 <property name="map1">
    23 <map>
    24 <entry key="key-map1" value="value-map1"></entry>
    25 <entry key="key-map2" value="value-map2"></entry>
    26 <entry key="key-map3" value="value-map3"></entry>
    27 </map>
    28 </property>


    通过构造器注入值

    1 <constructor-arg index="0" ref="personDao1"></constructor-arg>
    2 <constructor-arg index="1" value = "sss"></constructor-arg>    

    index表示构造器参数的索引,从0开始

    使用注解的方式注入依赖对象
    @Autowired或者@Resource注解进行装配。但我们需要在xml配置文件中配置一下信息。
    @Autowired:默认按类型进行装配
    @Resource:默认按名称进行装配,名称找不到再按类型装配
    @Resource
    private PersonDao personDao1;
    根据字段名称,到beans.xml中寻找名称相同的bean,然后将这个bean注入进来
    如果找不到就会根据类型去找
    不一定要注入在字段上,还可以注入到set方法上

    当一个项目需要注入多个bean时,配置文件就会变的臃肿,因此在spring2.5的时候为我们提供
    了<context:component-scan base-package="cn.itcast"></context:component-scan>
    去自动扫描包下面的标注了注解@Service和@Repository和@component和@Controller
    的类,并将这些类自动纳入spring容器中管理。同时可以为这些类指定作用域和名字哦,如:@Resource("name1") @Scope("pototype"),如果没有指定名称的话,这时候ctx.getBean("bean名称")中的bean名称就是类名称,但首字母小写

    被@PostConstructs注解的方法是在Bean初始化时被调用的方法
    被@PreDestory注解的方法是Bean实例被销毁之前调用该方法


    AOP--切面
    proxy代理类,只有是面向接口编程时 才能使用proxy代理类
    目标对象必须要实现接口
    代理对象实现了目标对象的所有方法,

    使用cglib创建代理对象

     springAOP

    定义一个切面(基于注解):

     1 /**
     2  * 切面
     3  *
     4  */
     5 @Aspect
     6 public class MyInterceptor {
     7     @Pointcut("execution (* cn.itcast.service.impl.PersonServiceBean.*(..))")
     8     private void anyMethod() {}//声明一个切入点
     9     
    10     @Before("anyMethod() && args(name)")
    11     public void doAccessCheck(String name) {
    12         System.out.println("前置通知:"+ name);
    13     }
    14     @AfterReturning(pointcut="anyMethod()",returning="result")
    15     public void doAfterReturning(String result) {
    16         System.out.println("后置通知:"+ result);
    17     }
    18     @After("anyMethod()")
    19     public void doAfter() {
    20         System.out.println("最终通知");
    21     }
    22     @AfterThrowing(pointcut="anyMethod()",throwing="e")
    23     public void doAfterThrowing(Exception e) {
    24         System.out.println("例外通知:"+ e);
    25     }
    26     
    27     @Around("anyMethod()")
    28     public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
    29         //if(){//判断用户是否在权限
    30         System.out.println("进入方法");
    31         Object result = pjp.proceed();
    32         System.out.println("退出方法");
    33         //}
    34         return result;
    35     }
    36     
    37 }

    定义一个切面(基于配置文件):

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:context="http://www.springframework.org/schema/context" 
     5        xmlns:aop="http://www.springframework.org/schema/aop"      
     6        xsi:schemaLocation="http://www.springframework.org/schema/beans
     7            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
     8            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
     9            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
    10         <aop:aspectj-autoproxy/> 
    11         <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"></bean>
    12         <bean id="aspetbean" class="cn.itcast.service.MyInterceptor"/>
    13         <aop:config>
    14             <aop:aspect id="asp" ref="aspetbean">
    15                 <aop:pointcut id="mycut" expression="execution(* cn.itcast.service..*.*(..))"/>
    16                 <aop:before pointcut-ref="mycut" method="doAccessCheck"/>
    17                 <aop:after-returning pointcut-ref="mycut" method="doAfterReturning"/>
    18                   <aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"/>
    19                   <aop:after pointcut-ref="mycut" method="doAfter"/>
    20                   <aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
    21             </aop:aspect>
    22         </aop:config>
    23 </beans>

    spring aop execution表达式说明

     1 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点"
     2 
     3 例如定义切入点表达式 execution(* com.sample.service.impl..*.*(..))
     4 
     5 execution()是最常用的切点函数,其语法如下所示:
     6 
     7  整个表达式可以分为五个部分:
     8 
     9  1、execution(): 表达式主体。
    10 
    11  2、第一个*号:表示返回类型,*号表示所有的类型。
    12 
    13  3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。
    14 
    15  4、第二个*号:表示类名,*号表示所有的类。
    16 
    17  5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。
  • 相关阅读:
    oracle 怎样查询某用户下的所有表的表名
    Oracle db_name, db_unique_name, global_name 的区别
    Oracle 修改 GLOBAL_NAME 和 SERVICE_NAME
    Oracle中DB_NAME,SID,DB_DOMAIN,SERVICE_NAME等之间的区别
    spoon(kettle)基本配置(连接Mysql和Oracle)
    ESLint学习(四)如何在提交时检查代码
    ESLint学习(三)webpack中使用ESLint
    ESLint学习(二).eslintignore文件
    ESLint学习(一)简介、安装、配置、命令行、规则
    host学习(一)如何修改host?提示无法修改host怎么办?
  • 原文地址:https://www.cnblogs.com/jiangjianzhu/p/5714153.html
Copyright © 2011-2022 走看看