您的位置:首页 > 编程语言 > Java开发

Spring学习笔记-基础

2017-05-08 20:37 405 查看

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
文件

为项目配置合适的
Artifact
Facets
Modules
,就是选选文件配置路径什么的,如果哪里不对或缺失,右下方会有提示,点击
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_name
get+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.jar
aopliance.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring ioc和aop