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 学习基础笔记 包括spring 的代理 JDK CGLIB 事物 AOP 以及各种注入
- Spring Data JPA,基础学习笔记.
- Spring学习笔记1——基础知识
- Spring学习笔记-spring基础知识概述
- Spring3 学习笔记之(spring core 之IoC基础)
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- java 从零开始,学习笔记之基础入门<Struts2_Spring_整合>(四十一)
- SpringMVC + Spring + MyBatis 学习笔记:提交数据遭遇基础类型和日期类型报400错误解决方法
- spring学习笔记1——部分基础及概念
- Spring学习笔记1——基础知识
- 【spring】【转】Spring学习笔记1——基础知识
- 【Spring学习笔记】之【6.1 AOP之AOP基础】
- [原]spring学习笔记8.2动态代理基础
- Spring学习笔记1——基础知识
- Spring基础学习笔记1
- Spring学习笔记1——基础知识 .
- 【Spring学习笔记】之【5.2 Spring表达式语言之SpEL基础】
- Spring学习笔记(一) Spring基础IOC、AOP
- spring学习笔记(15)——AOP基础
- Spring学习笔记-基础知识