Spring小结

企业级系统:
大规模:用户数量多、数据规模大、功能众多
性能和安全要求高
业务复杂
灵活多变
Spring是轻量级框架,java EE的春天
目标:使现在技术更加易用,推进编码最佳实践
内容:
1、IoC容器--控制反转(IoC:Inversion of Control)(依赖注入DI:Dependenty Injection)()()
2、AOP实现
3、数据访问支持(简化JDBC/orm框架    声明式事务)
4、web集成


依赖:在代码中一般指通过局部变量、方法参数、返回值等建立的对于其他对象的调用关系。例子:在A类的方法中实例化了B类的对象并且调用了其方法完成了特定的功能。我们就说A类依赖了B类
以前的代码比如;业务层调用数据访问层实现持久化操作------高耦合
现在实现-------高内聚
解释名词:
耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息
内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。
所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
耦合:一个软件结构内不同模块之间互连程度的度量。
对于低耦合,:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合。


引出控制反转的概念:不再依靠自身的代码去获得依赖的具体DAO对象,而是把这一工作交给第三方工厂,体现了高内聚!而这个过程"在如何获取依赖对象上"就是控制反转。
依赖注入:由容器负责把组件所“依赖”的具体对象“注入”(赋值)给组件,避免组件之间以编码的方式耦合
<bean id="helloSpring" class="cn.springdemo.HelloSpring">
使用<bean>元素定义一个组件;表示定义的Bean实例的名称
id属性:指定一个唯一的访问名称
name属性:指定多个别名,名字之间使用逗号,分号,或者空格进行分割
class属性:指定实体对象的路径;表示定义的Bean实例的类型


ApplicationContext 是一个接口,负责读取Spring配置文件,管理对象的加载,生成。维护Bean对象以及Bean对象之间的依赖关系,负责Bean对象的生命周期。


设值注入:通过调用属性的setter方法


增强处理(Advice)分类:
前置增强
后置增强
环绕增强
异常抛出增强
最终增强


切面(Aspect):一个模块化的横切逻辑可能会横切多个对象
连接点(join Point):程序执行中的某个具体执行点
增强处理:切面在某个特定连接点上执行的代码逻辑
切入点(Pointcut):对连接点的特征进行描述,可以使用正则表达式。增强处理和一个切入点表达式相关联,并在与这个切入点匹配的某个连接点上运行。
目标对象(target object):被一个或者多个切面增强的对象
AOP代理(AOP proxy):由AOP框架所创建的对象,实现执行增强处理方法
织入(Weaving):将增强处理连接到应用程序中的类型或者对象上的过程
增强处理类型:前置增强、后置增强、环绕增强、异常抛出增强、最终增强


切入点的表达式:
execution是切入点指示符,它的括号中是一个切入点表达式,可以配置需要切入增强处理的方法的特征,切入点表达式支持模糊匹配,
public * addNewUser(entity.User): "*"表示匹配所有类型的返回值。
public void *(entity.User): "*"表示匹配所有方法名。
public void addNewUser(..): ".."表示匹配所有参数个数和类型。
* com.service.*.*(..): 这个表达式匹配com.service包下所有类的所有方法。
* com.service..*.*(..): 这个表达式匹配com.service包及其子包下所有类的所有方法。




<bean id="service" class="com.service.impl.UserServiceImpl">
    <!--1. 依赖setter方法注入 -->
    <!-- 灵活性好,但setter方法数量较多     时效性差   通过无参构造法实例化 -->
        <property name="userdao" ref="dao"/> -->
        
        <!--2. 依赖构造方法 -->
        <!-- 灵活性差, 时效性好,通过匹配构造方法实例化  -->
        <constructor-arg name="userdao" index="0" ref="userdao"/>
        <!-- <constructor-arg index="2" value="tomcat"/>
        <constructor-arg index="1" value="address"/> -->
</bean> 
1.一个<constructor-arg>元素表示构造方法的一个参数,且使用时不区分顺序
2.可用index属性:
3.可用name属性来直接定位到那个对象
4.type属性指定参数的类型,避免字符串和基本数据类型混淆


<!-- p命名空间 -->
<bean id="zhangga" class="com.hbtt.springStudy.PersionZ" p:who="张嘎" p:context="三天不打小鬼子,收到洋洋"/>


<bean id="zhangga" class="com.hbtt.springStudy.PersionZ">
    <property name="who">
    <value>张嘎</value>
    </property>
    <property name="context">
        <value>三天不打小鬼子,收到洋洋</value>
    </property>
</bean>




面向切面编程(AOP):适用于具体横切逻辑的场合,例如:访问控制、事务管理(日志,异常)、性能监测
目标:专心做事
原理:将复杂需求分解出不同的方面,将散布在系统中的公共功能集中解决,采用代理机制组装起来,再不改变源代码的基础上对代码段进行增强处理,增加新功能


横切逻辑:在业务层,散落在系统中不得不处理的事,这些穿插在既定业务中的操作就是横切逻辑,也称切面


实现依赖注入的方法
1、访问器注入   setter方法
2、构造注入
3、p命名空间


注入不同的数据类型
1、注入直接量
2、引用其他bean组件
3、使用内部Bean
4、注入集合类型的属性
5、注入null和空字符串


使用注解实现IoC的配置
1.使用注解定义Bean
@Component--通过注解定义DAO
@Repository--用于标注DAO类
@Service--用于标注业务类
@Controller--用于标注控制器类
2.使用注解实现Bean组件装配
@Autowired--实现Bean的装配,采用按类型匹配的方式为属性自动装配合适的依赖对象,即容器会查找和属性类型相匹配的Bean组件,并自动为属性注入。
3.加载注解定义的Bean
<context:component-scan base-package="service,dao" />
4.使用Java标准注解完成装配
@resource有一个name属性,默认情况下,spring将这个属性值解释为要注入的Bean的名称
@resource(name="userDao")


使用注解定义切面
@Aspect




proxy:class aspect j框架实现 CGLIB来实现
  interface jdk只能实现基于接口的代理
  
<aop:aspectj-autoproxy proxy-target-class="false" />


实现aop的方式两种
1.基于注解-------aspect
2.基于配置文件----<aop:config>和bean一起使用
注意:如果项目采用JDK5.0以上版本,可以考虑使用@AspectJ注解方式,减少配置的工作量;如果不使用注解或者版本太低无法使用注解,则可以选择使用<aop:config>配合普通的JavaBean的形式
<aop:config>
        <!-- 定义切入点 -->
        <aop:pointcut id="pointcut" expression="execution( * com.service..*.*(..))" />
        <!-- 引用包含增强方法的Bean -->
        <aop:aspect ref="theLogger">
            <!-- 将before()方法定义为前置增强并引用pointcut切入点 -->
            <aop:before method="before" pointcut-ref="pointcut"/>
            <!-- 将afterReturning()方法定义为后置增强并引用pointcut切入点 -->
            <!-- 通过returning属性指定为名为result的参数注入返回值 -->
            <aop:after-returning method="afterReturning" pointcut-ref="pointcut" returning="result" />
        </aop:aspect>
</aop:config>






Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。


两个重要模块:Spring 面向方面编程(AOP)和控制反转 (IOC) 容器。


控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。


容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值