spring是一个开源的轻量级JavaEE框架,使用分层架构,主要部分是面向切面编程(AOP)和控制反转(IOC)容器代码的实现。提高复用性和松耦合,具有动态可扩展性
Eclipse普遍比Idea要好配置的多
web/WEB-INF/lib
目录下src
目录下创建applicationContext.xml
文件src
目录下创建applicationContext.xml
文件Artifact
、Facets
和Modules
,就是选选文件配置路径什么的,如果哪里不对或缺失,右下方会有提示,点击fixed
就会自动调整了一般来说,xml文件内容配置成这样就通用了
<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容器就是为了管理Bean,创建Bean的一个内存区,在这个内存区中可以将操作Bean的代码以面向接口的方式进行开发。
这样基于接口的多态性,程序结构的分层就更加灵活化,维护和扩展也很方便。IOC概念从技术上来讲就是将接口和实现相分离
通过IOC容器可以完全管理JavaBean,包括创建、销毁,还可以对数据库的JavaBean进行自动化的事务处理,还支持一些企业级的应用。Spring的IOC容器完全脱离了平台,用最简单的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方法
<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());
}
}
如同在学习Servlet时使用注解配置一样,这里也可使用注解配置,有下面两种
下面说的这种方式都是主要针对其中一个JavaBean是另一个JavaBean的属性时的注入
- 注释之前对对象的属性的注入的配置(配置对象是注入,给对象的属性赋值同样是注入)
- 添加
表示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方法
}
同样的,下面说的这种方式都是主要针对其中一个JavaBean是另一个JavaBean的属性时的注入
- 在xml文件中把标签中所有的标签都注释掉
- 添加
,表示spring所需要的Bean都在该路径下
- 再在该包下所有的Bean类定义之前加上@Compent("name")
,表名该类是Bean,name
是要被注入的该Bean类的对象名
- 若有一个类是另一个类的属性,则在该属性前加上@Autowired
注解
- 其余的属性可以自由赋值
传统的创建对象的方式:通过new关键字来创建一个对象
IOC方式:对象的声明周期由Spring来管理,直接从Spring那里获取一个对对象。IOC是反转控制,意即本来对象的控制权在使用者手里,现在反过来交给了Spring
打个比喻:
传统方式:相当于你自己去菜市场new 了一直鸡,但是是生鸡,要自己拔毛,去内脏,再上花椒,酱油,烤制,经过各种工序之后,才可以食用。
IOC:相当于去馆子(Spring)点了一直 鸡,交到你手上的时候,已经五味俱全,你就只管吃就行了。
AOP:面向切面编程,意即面向一小段代码编程。AOP把功能分为核心功能和周边功能,而周边功能在Spring的AOP思想里就被定义为切面Aspect。这种能够选择性的,低耦合的把切面和核心业务功能结合在一起的编程思想,就叫做切面编程。
所谓AOP思想就是两种功能分别独立开发,然后再“编织”在一起
AOP可以在不改变原始代码的基础上做一些功能性的增强
需要额外的Jar包:aspect.jar
和aopliance.jar
/**
* 作为核心业务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 ....>
<bean id="s" class="service.ProductService">bean>
<bean id="loggerAspect" class="aspect.LoggerAspect">bean>
<aop:config>
<aop:pointcut id="loggerCutpoint"
expression=
"execution(* service.ProductService.*(..))"/>
<aop:aspect id="logAspect" ref="loggerAspect">
<aop:around pointcut-ref="loggerCutpoint" method="log"/>
aop:aspect>
aop:config>
beans>
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();
}
}
本来是想直接在这次写上的,但是,还是下次和IOC的高级用法写在一起吧,算偷个懒挖个坑。
哦,当然了,AOP的注释写法也下次再写好了233333
准备了很久的JavaEE学习,现在终于提上了日程,随便也要把之前遗漏的Servlet和Jsp准备准备填坑了
呐现在挖坑:Servlet学习总结笔记、Jsp总结笔记、Spring更为高级的用法etc
PS:首先还是总结这几个框架任意组合的配置方法,idea配置起来真的麻烦啊….F__k