`

Spring初体验

阅读更多
    Hibernate之后就迎来了Spring, ^_^  ^_^  不过此处据说是让人看不到春天的。

     Spring框架的特点:

    1、 黏合剂: 面向组件开发的技术, Spring提供了对已有的各种组件技术的融合。

   2、 轻量级的框架: 指应用程序基于框架开发依赖于API的严重程度低(这样子学习成本低 且 便于框架更换)。

          都说学习Spring没什么新东西, 主要的就是学习一些思想。 因此今天我便开始学习了IOC思想。

         IOC降低了面向对象编程对象之间的耦合度, 学习IOC主要要注意两个方面的问题:

        a、 控制什么: 对象之间的依赖关系是什么

       b、 反转到哪里

     ————IOC容器主要做了两项工作:

    a、 创建对象

   b、 根据对象之间的依赖关系进行注入——使用属性的get()/set()方法 或者使用构造函数。

   

   重点是applicationContext.xml文件的配置, 多练习....



  Spring & AOP ——————面向切面编程

  切面: 和业务逻辑的核心实现没有关系, 但业务逻辑的实现需要某个领域提供相应的服务(如炒菜与洗菜,刷锅)。

   在学习AOP时重点提到了代理模式: 代理模式的用途在于为真正的对象提供一个服务。

   代理模式又分为静态代理与动态代理, 静态代理只为某一种对象提供服务, 而动态代理可以为不同类型接口类型的对象提供服务。

   代理模式中存在三种角色, 分别是  真实对象、 代理对象、 一个真实对象和代理对象的接口

  ——————————————如下贴出我写的AOP练习 (以  洗菜——炒菜——洗碗 为例)

    A、 不使用代理模式:

   public class Worker {

public void beforeWork()
{
  System.out.println("炒菜准备工作");
}

public void doWork()
{
  beforeWork();
  System.out.println("正在炒菜.....");
  afterWork();
}

public void afterWork()
{
  System.out.println("洗碗工作");
}
}
    不使用代理模式有一个很大的弊端就是每次炒菜时都得重复地调用beforeWork()与afterWork()方法, 这样子造成了代码冗余

B、 使用静态代理模式:

       CookInterface.java  ——真实对象与代理对象的共同接口

   public interface CookInterface {

public void doCooking();

}

    CookImpl.java   ——真实对象, 实现炒菜这个核心业务

   public class CookImpl implements CookInterface{

public void doCooking() {
  System.out.println("正在炒菜....");
  try {
   Thread.sleep(3000);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 
}


CookProxy.java   ——代理对象

  public class CookProxy implements CookInterface{ //代理对象与真实对象实现同一个接口

CookInterface cooker;

public CookInterface getCooker() {
  return cooker;
}

public void setCooker(CookInterface cooker) {
  this.cooker = cooker;
}

public void doCooking() {
  beforeWork();
  cooker.doCooking();
  afterWork();
}

/**
  * 将为核心业务服务的方法抽取到代理对象中
  *
  */
public void beforeWork(){
  System.out.println("洗菜");
}

public void afterWork(){
  System.out.println("洗碗");
}

}



TestAop.java   ——测试类

public class TestAop {

public static void main(String[] args) {
  CookInterface cooker = new CookImpl();
  CookProxy cookerProxy = new CookProxy();
  cookerProxy.setCooker(cooker);
  cookerProxy.doCooking();
}

}

    静态代理模式虽然减少了代码冗余, 但是其只能为实现某一种类型接口的特定对象提供服务



C、 动态代理:  (动态代理类与测试类发生了变化, 其他两个类同上)

     CookDynamicProxy.java ——动态代理类

   /**
* 为不同接口类型的对象动态产生代理对象
* @author Administrator
*
*/
public class CookDynamicProxy implements InvocationHandler{

private Object targetObject; //真实对象
/**
  * 动态产生代理对象
  */
public Object createProxyObject(Object targetObject){
  this.targetObject = targetObject;
  return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
    targetObject.getClass().getInterfaces(), this);
 
}

/**
  * 提供代理的服务(切面)
  * proxy是代理对象
  * method是代理对象调用的方法
  * args是调用方法的实参列别
  */
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  beforeWork();
  //调用真实对象的方法
  Object result = method.invoke(targetObject, args);
  afterWork();
  return result;
}

public void beforeWork(){
  System.out.println("洗菜");
}

public void afterWork(){
  System.out.println("洗碗");
}

}



TestDynamicProxy.java

public class TestDynamicProxy {

public static void main(String[] args) {
  CookInterface cooker = new CookImpl();
  CookInterface cookerProxy = (CookInterface)new CookDynamicProxy().createProxyObject(cooker);
  cookerProxy.doCooking();
}

}

这样子就与具体的接口解耦了。 ^_^  ^_^  这是一种比较好的做法。



D、 在Spring中使用动态代理模式, 通过配置appicationContext.xml以及调用Spring API的方式实现

       这种方式主要是配置applicationContext.xml, 如下是我的配置:

     <!-- 配置真实对象 -->
   <bean id="realWorker" class="cn.com.aop.CookImpl"></bean>
   <!-- 配置通知 -->
   <bean id="arroundNote" class="cn.com.aop.ArroundLog"></bean>
    <!-- 配置动态代理 -->
    <bean id="workProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <!-- 指定要实现的接口 -->
    <property name="interfaces"><value>cn.com.aop.CookInterface</value></property>
    <!-- 指定代理的真实对象 -->
    <property name="target" ref="realWorker"></property>
    <!-- 指定运行时织入的通知 -->
    <property name="interceptorNames">
    <list>
    <value>arroundNote</value>
    </list>
    </property>
    </bean>

   关于源文件只有如下两个与上面的源文件不同, 列举如下:

   ArroungLog.java   ——通知

  /**
* 切面代码,在方法的前后进行织入
* @author Administrator
*
*/
public class ArroundLog implements MethodInterceptor {

public Object invoke(MethodInvocation arg0) throws Throwable {
  beforeWork();
  Object result = arg0.proceed();
  afterWork();
  return result;
}

public void beforeWork(){
  System.out.println("洗菜");
}

public void afterWork(){
  System.out.println("洗碗");
}
}

Test.java  ——测试类

public class Test {
public static void main(String[] args) {
  Resource resource = new ClassPathResource("applicationContext.xml");
  BeanFactory bf = new XmlBeanFactory(resource);
  CookInterface cooker = (CookInterface)bf.getBean("workProxy");
  cooker.doCooking();

 
}

}

分享到:
评论

相关推荐

    CH01-Spring初体验.pptx

    搭建Spring开发环境 Bean的常用配置 三种模式实现依赖(以service调用dao举例) 在serivce里面的类创建dao里面类的对象,调用方法 用工厂模式实现,service先通过工厂创建出来的dao,再调用其方法(面向接口编辑)...

    Spring Boot入门初体验

    Boot入门初体验是一门针对初学者准备的课程,讲解了如何一步一步进入Spring?Boot开发,课程采用循序渐进的方式,一个知识点一个知识点的讲解和学习,让初学者不知不觉的掌握各种开发技能,课程包含了主流框架搭建、...

    CXF&spring实例

    3. **服务端java**:"CXF&spring初体验【服务端java】"可能会包含具体的Java代码示例,展示如何在Spring容器中定义服务接口和实现,以及如何利用CXF的注解来声明服务元数据。 客户端的实现则涉及到如何调用服务端的...

    头歌Spring Boot初体验.rar

    "头歌Spring Boot初体验"可能是一个文档,旨在引导初学者入门Spring Boot的世界。下面我们将深入探讨Spring Boot的核心特性和如何开始使用它。 1. **简介** Spring Boot是基于Spring框架构建的应用程序的快速启动...

    Spring For Android初体验

    《Spring for Android初体验》 在移动开发领域,Android开发者通常使用Java或Kotlin进行应用构建,但随着技术的发展,Spring框架也开始涉足Android世界。Spring for Android是Spring.io推出的一个库,旨在帮助...

    spring-security初体验demo

    这个"spring-security初体验demo"很可能是为了帮助初学者理解如何在实际项目中集成和配置Spring Security。下面,我们将深入探讨Spring Security的核心概念、工作原理以及如何通过实践来设置一个简单的示例。 ...

    spring cloud初体验

    Spring Cloud是一个分布框架 Spring Cloud里边包括了目前最新的所有组件共21个

    SpringSecurity初体验之手动配置用户名密码

    此文章是记录博主在学习springsecurity时的笔记 第一步 创建一个SpringBoot工程,勾选上需要的依赖。 第二步 创建一个名为securityconfig的配置类,该类基础了父类WebSecurityConfigurerAdapter(提供用于创建...

    【预习资料】用300行代码手写初体验Spring V1.0版本.docx

    《手写Spring V1.0版本的初体验》 在IT行业中,深入理解框架的内部原理对于提升开发技能至关重要。Spring作为Java领域的主流框架,其设计理念和实现方式一直是开发者们热衷探讨的话题。本预习资料的目标是带领具有1...

    《Spring-Boot入门初体验》-视频教程-示例项目源代码 -SBTest.zip数学建模

    数学建模 《Spring_Boot入门初体验》_视频教程_-_示例项目源代码。_SBTest.zip

    头歌springboot初体验

    通过"头歌springboot初体验.pdf"这份文档,你可能会学习如何创建一个基本的Spring Boot项目,了解Maven或Gradle的配置,编写第一个"Hello, World!"程序,理解自动配置的工作原理,并逐步接触Spring Boot的其他特性。...

    详解SpringBoot+SpringSecurity+jwt整合及初体验

    SpringBoot+SpringSecurity+jwt整合详解 SpringBoot是当前最流行的Java框架之一,它提供了便捷的方式来构建基于Web的应用程序。然而,在构建Web应用程序时,安全性是不可忽视的重要方面。因此,本文将详细介绍如何...

    【预习资料】用300行代码手写初体验Spring V1.0版本.pdf

    《手写Spring V1.0版本:从300行代码理解核心机制》 Spring框架作为Java企业级应用开发中的重要支柱,其设计理念和实现方式一直是开发者深入学习的重点。通过手写Spring V1.0版本的代码,我们可以从实践中更好地...

    聊聊Spring Cloud Cli 初体验

    Spring Cloud CLI 是Spring Cloud生态体系中的一个重要工具,它基于Spring Boot CLI扩展而来,为开发者提供了一种便捷的方式来管理和操作Spring Cloud的各种微服务组件。本文将深入探讨Spring Cloud CLI的使用和功能...

    从入门到高级实战-深度探索SpringSecurity安全框架视频.zip

    02.Spring Security 初体验 03.基于内存定义 Spring Security 用户 04.Spring Security 自定义表单登录 05.Spring Security 登录表单配置细节 06.Spring Security 表单登录源码 07.Spring Security 中的 JSON 交互 ...

    Acegi(四):Acegi初体验及初解剖

    在初体验部分,博主可能会介绍如何设置Acegi以保护一个简单的Spring应用,包括配置Spring XML文件、定义安全拦截器(filter)以及创建用户凭证。 身份验证过程通常涉及用户登录,Acegi支持多种认证方式,如基于表单...

    上面maven工具使用springboot项目初体验的压缩包

    总之,这个压缩包提供了使用Maven和IDEA 2023.3开发Spring Boot应用的初步体验,涵盖了从项目结构、依赖管理、数据库连接到实际业务代码编写和测试的各个环节。对于想要学习或已经在使用Spring Boot的开发者来说,这...

    Spring MVC简单样例

    在"Spring MVC 实战学习系列(一)初体验"中,我们可能首先会接触如何搭建Spring MVC的基本环境。这通常涉及到以下几个步骤: 1. 引入依赖:在项目中添加Spring MVC的依赖,例如在Maven的pom.xml文件中引入spring-...

    Web基础——WebApp之初体验(三)

    在本篇关于“Web基础——WebApp之初体验(三)”的文章中,我们将深入探讨Web应用程序(WebApp)的关键概念和技术,以及它们如何为用户提供便捷的在线体验。WebApp是互联网技术的重要组成部分,它们允许用户在浏览器...

Global site tag (gtag.js) - Google Analytics