Spring学习笔记-基础

Spring介绍

spring是一个开源的轻量级JavaEE框架,使用分层架构,主要部分是面向切面编程(AOP)和控制反转(IOC)容器代码的实现。提高复用性和松耦合,具有动态可扩展性

Eclipse和IDEA的项目构建

Eclipse普遍比Idea要好配置的多

Eclipse

  • 新建一个Project,都可以
  • 导入外部的Jar包,组成新的Libraries
  • 如果是Java Web项目还需要把所有的Jar包复制进web/WEB-INF/lib目录下
  • src目录下创建applicationContext.xml文件

Idea

  • 创建Java项目,从右边栏中选择Spring4,然后勾上对号
  • 在下方选择Use Libraries,然后选择所需要的Jar包导入成Libraries
  • 一路自由设置
  • 进入项目后在src目录下创建applicationContext.xml文件
  • 为项目配置合适的ArtifactFacetsModules,就是选选文件配置路径什么的,如果哪里不对或缺失,右下方会有提示,点击fixed就会自动调整了

配置文件的组装

一般来说,xml文件内容配置成这样就通用了

<?xmlversion="1.0"encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task-3.1.xsd">

<beans>

IOC/DI

IOC:控制反转,有的时候也称为DI,也即依赖注入。可以这样理解:

IOC容器就是为了管理Bean,创建Bean的一个内存区,在这个内存区中可以将操作Bean的代码以面向接口的方式进行开发。
这样基于接口的多态性,程序结构的分层就更加灵活化,维护和扩展也很方便。IOC概念从技术上来讲就是将接口和实现相分离

IOC容器

通过IOC容器可以完全管理JavaBean,包括创建、销毁,还可以对数据库的JavaBean进行自动化的事务处理,还支持一些企业级的应用。Spring的IOC容器完全脱离了平台,用最简单的JavaBean技术实现接口与实现的分离,并对组件的调配提供很好的支持

下面开始操作:

先准备一个JavaBean

public class CategoryBean {
    private int id; 
    private String name;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

注意

经过实验发现,如果变量的getter和setter方法命名不规范,在程序运行时会出错。所以建议遵守
set+Variale_nameget+Variable_name来命名getter和setter方法

再在applicationContext.xml文件中添加Bean配置

<beans ....>
    <bean name="cate" class="pojo.Category">
        <property name="name" value="hellosocra" />
    </bean>
</beans>

这里需要讲解一下配置的细节:
- 首先是标签中的name属性,这里就是创建一个名为cate的CategoryBean对象
- xml配置文件中标签的id属性和name属性基本上没有什么区别,但是使用id会更加符合规范,因为xml中id要求是唯一的
- class属性的值就是CategoryBean.java的路径,要加上包名
- 标签是为了给对象cate中的属性赋值的,这里会自动调用变量的getter和setter方法进行赋值,如果命名不规范,就无法赋值
- name对应着cate的属性名,value就是赋值,本例赋予了name属性的值是hellosocra
- 中还可以使用ref来给属性值进行链接,然后使用链接处的值,这也是注入值的过程

使用注入的对象

既然已经添加了注入对象的配置,现在看看如何使用注入的对象

public class TestSpring {

    public static void main(String[] args) {
        // 1.必备的语句,可以定义为全局变量 
        ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "applicationContext.xml" });

        // 2.开始使用IOC的getBean()方法来获取对象,但要主要强制类型转换
        Category cate = (Category) context.getBean("cate");
        // 3.使用Bean对象的方法
        System.out.println(cate.getName());
    }
}

注解方式配置IOC

如同在学习Servlet时使用注解配置一样,这里也可使用注解配置,有下面两种

针对“注入对象行为”的注解

下面说的这种方式都是主要针对其中一个JavaBean是另一个JavaBean的属性时的注入
- 注释之前对对象的属性的注入的配置(配置对象是注入,给对象的属性赋值同样是注入)
- 添加<context:annotation-config/>表示spring要采用注解的方式进行配置
- 在要注入对象的对应属性前加上@Autowired注解,或者在对应属性的setter方法前加上@Autowired注解
- 在要注入对象中的属性(另外的JavaBean充当该bean的属性)前加上@Resource(xxx=xxx)注解,举个例子

class ABean{
  String name ;
  int id;
  // ....getter和setter方法
}

class BBean{
  @Resource(name="socra",id=5)
  A a; // A作为B的属性
  int no;
  // ....getter和setter方法
}

针对“Bean”的注解

同样的,下面说的这种方式都是主要针对其中一个JavaBean是另一个JavaBean的属性时的注入
- 在xml文件中把标签中所有的标签都注释掉
- 添加<context:componment-scan base-backage="JavaBean所在的包以及Bean名">,表示spring所需要的Bean都在该路径下
- 再在该包下所有的Bean类定义之前加上@Compent("name"),表名该类是Bean,name是要被注入的该Bean类的对象名
- 若有一个类是另一个类的属性,则在该属性前加上@Autowired注解
- 其余的属性可以自由赋值

IOC原理

传统的创建对象的方式:通过new关键字来创建一个对象
IOC方式:对象的声明周期由Spring来管理,直接从Spring那里获取一个对对象。IOC是反转控制,意即本来对象的控制权在使用者手里,现在反过来交给了Spring

打个比喻:
传统方式:相当于你自己去菜市场new 了一直鸡,但是是生鸡,要自己拔毛,去内脏,再上花椒,酱油,烤制,经过各种工序之后,才可以食用。
IOC:相当于去馆子(Spring)点了一直 鸡,交到你手上的时候,已经五味俱全,你就只管吃就行了。

解释的生动传神,(滑稽
这里写图片描述

AOP

AOP:面向切面编程,意即面向一小段代码编程。AOP把功能分为核心功能和周边功能,而周边功能在Spring的AOP思想里就被定义为切面Aspect。这种能够选择性的,低耦合的把切面和核心业务功能结合在一起的编程思想,就叫做切面编程。
所谓AOP思想就是两种功能分别独立开发,然后再“编织”在一起

AOP可以在不改变原始代码的基础上做一些功能性的增强

需要额外的Jar包:aspect.jaraopliance.jar

准备一个核心业务Bean和切面辅助Bean

/**
 * 作为核心业务Bean
 */
public class ProductService{
    public void dosomeService(){
        System.out.println("dosomeService");
    }   
}
/**
 * 作为切面辅助Bean
 */
public class LoggerAspect {
    public Object log(ProceedingJoinPoint joinPoint){
        Object obj = null;
        System.out.println("start log: " + joinPoint.getSignature().getName());
        try {
            obj = joinPoint.proceed();// 继续执行,本例指执行dosomeService()
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("end log: " + joinPoint.getSignature().getName());
        return obj;
    }

}

添加配置

<beans ....>
    <!-- 1.声明核心业务对象 -->
    <bean id="s" class="service.ProductService"></bean>
    <!-- 2.声明辅助日志切面 -->
    <bean id="loggerAspect" class="aspect.LoggerAspect"></bean>
    <!-- 5.通过aop:config把业务对象与辅助功能编制在一起 -->
    <aop:config>
        <!-- 3.指定核心业务功能 -->
        <aop:pointcut id="loggerCutpoint"
            expression=
            "execution(* service.ProductService.*(..))"/>
        <!-- 4.指定辅助功能 -->
        <aop:aspect id="logAspect" ref="loggerAspect">
            <aop:around pointcut-ref="loggerCutpoint" method="log"/>
        </aop:aspect>
    </aop:config>
</beans>
  • 首先要规定好核心业务Bean还有切面辅助Bean,设置好它们的对象名以及路径
  • 标签有指定好核心业务和切面辅助入口,id属性都是对象名
  • 中的expression属性的一般值为execution(* package_name.Bean_name.*(..)),表示核心业务Bean中的方法入口(核心业务中可以不止一个方法)
  • 标签中id被注入了值,pointcut-ref属性指定了辅助切面辅助的对象,method是调用辅助切面中的辅助方法

至此已经设置好了切面辅助,当从上到下,先执行核心业务功能后执行辅助业务

使用

因为使用AOP,使用时和没有加入切面时的步骤是一样的,正因为如此也体现了AOP的优越特性

public class TestAspect {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ApplicationContext apc = new 
                ClassPathXmlApplicationContext("applicationContext.xml");

        ProductService s = (ProductService)apc.getBean("s");
        s.dosomeService();
    }

}

AOP更高级的用法

本来是想直接在这次写上的,但是,还是下次和IOC的高级用法写在一起吧,算偷个懒挖个坑。
哦,当然了,AOP的注释写法也下次再写好了233333

久违了

准备了很久的JavaEE学习,现在终于提上了日程,随便也要把之前遗漏的Servlet和Jsp准备准备填坑了

呐现在挖坑:Servlet学习总结笔记、Jsp总结笔记、Spring更为高级的用法etc

PS:首先还是总结这几个框架任意组合的配置方法,idea配置起来真的麻烦啊….F__k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值