本篇博客为自己学习spring和springmvc的一个总结。主要以代码为主,至于文字性描述理解性东西,可以自行百度。有认识不妥的地方,还望指出,相互学习。
以前很困惑spring中的一些概念,在学习过程中遇到了很都问题,目前基本解决。解决的方法:
① 总结Spring框架的运行流程:在框架中,程序如何运行的?流程是什么? 可以适当的参考一部分源码解析
② 理解IOC本质。因为spring是一个容器框架,所以就是用来装东西的,就像tomcat,作用服务器一样。而IOC就是spring通过主配置文件(applicationContext.xml)的相关配置,为我们程序中自动的(底层通过反射方式,反射在框架中用的很过,私底下自己也在继续的深入的研究)为程序创建我们想要的bean对象。在spring中称之为注入,而所依赖的正是applicationContext.xml的配置。
配置方式:spring中提供了两种配置方式:基于xml方式的配置和基于注解的配置。对于前者可以实现对bean的统一的,清晰的,管理,但是需要手动的写,很麻烦(程序天生的就是为人的懒惰而服务);对于后者当然开发时候自己写的东西就少了,但是在统一管理方面稍差。凡事存在即合理。可以根据自己的需求选择自己的配置方式。
③ 理解AOP。java是一种面向对象的语言。而AOP是面向切面,在我看来是面向逻辑或者业务编程,它是对一组逻辑的抽象和分配。
经典例子,很多系统都有日志。以登录为例子。常规编程流程大致如下:点击登录--->写入日志--->后台处理--->写入日志。因为我们的系统中会有很多功能逻辑代码都是如此去处理日志。假设有一天,需求改变不需要日志了。那么我们如何去处理这些已经存在于整体逻辑单元中的日志代码?无非是找到每一个使用日志的地方,逐一删除。大家可想这样的效率?代码的耦合度?
而AOP变成。就是为了高度的解耦儿产生。它将登录的整个流程进行按照特定的,共同的业务逻辑进行切割,从而抽象出来了一组公共的逻辑单元。然后在根据不同业务模块的需求,在某些业务指定的地方将公共的业务逻辑植入其中,从而形成了一个整体的业务逻辑单元,实现某一模块功能。(这些是自己思考,总结的,刚开始接触的时候,没有理解到这点,也吃了很多闭门羹)有了这样的认识和理解,我们理解spring AOP中的一些常用的概念就很简单:
横切关注点:哪些业务需要拦截,拦截后干什么?
切面:若干个横切关注点的抽象结合。即:抽象出来的公共的业务逻辑单元
连接点:需要拦截的业务。原本剩下的业务逻辑
切入点:连接点的表达式。和通知相似。
通知:将共同的逻辑代码植入的提示。前置,后置,异常,返回,环绕。
IOC:控制反转,依赖注入。配置bean
1.注入方式:setter方法注入,构造器注入,复杂类型注入
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:tx="http://www.springframework.org/schema/tx" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 10 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> 11 <!-- 12 person p = new person(); 13 p.setname("lisi"); 14 --> 15 <!-- setter方法注入:1-空构造 2-属性提供setter方法 --> 16 <bean id="p" class="com.bena.Person"> 17 <property name="anme" value="lisi"></property> 18 </bean> 19 <!-- person p1 = new person("lisi",23); --> 20 <!-- 构造器注入:前提:必须提供对应的构造器 --> 21 <bean id="p1" class="com.bena.Person"> 22 <constructor-arg value="lisi"></constructor-arg> 23 <constructor-arg value="23"></constructor-arg> 24 </bean> 25 <!-- 复杂类型注入 --> 26 <bean id="addr" class="com.bena.Addrs"> 27 <property name="sheng" value="shanxi"></property> 28 <property name="shi" value="xian"></property> 29 </bean> 30 <bean id="person1" class="com.bena.Person1"> 31 <property name="name" value="zhangsan"></property> 32 <property name="age" value="23"></property> 33 <!-- <property name="addr" ref="addr"></property> --> 34 <property name="addr"> 35 <!-- 匿名对象 --> 36 <bean class="com.bena.Addrs"> 37 <property name="sheng" value="shanxi"></property> 38 <property name="shi" value="xian"></property> 39 </bean> 40 </property> 41 </bean> 42 43 </beans>
2.继承,模式改变,自动注入(byName,byType)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:tx="http://www.springframework.org/schema/tx" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 10 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd" default-autowire="byName"> 11 <!-- 继承 --> 12 <bean id="animal" class="com.bean2.Animal" abstract="true"> 13 <property name="name" value="123"></property> 14 <property name="age" value="23"></property> 15 </bean> 16 <!-- 默认单例,通过:scope改变模式:prototype:原型(非单例) --> 17 <bean id="student" class="com.bean2.Student" parent="animal"> 18 <property name="num" value="123456"></property> 19 </bean> 20 21 <bean id="teacher" class="com.bean2.Teacher" parent="animal"> 22 <property name="jixiao" value="12312"></property> 23 </bean> 24 25 <!-- 自动注入:在beans里添加:default-autowire属性 26 值:1-byName:根据名字注入:bean的id要跟类中的属性名相同 27 2-byType:根据类型注入:只能有一个该类型的bean跟属性的类型匹配 28 --> 29 <bean id="dao" class="com.bean3.Dao"></bean> 30 <bean id="service" class="com.bean3.Service"></bean> 31 <bean id="handler" class="com.bean3.Handler"></bean> 32 33 </beans>
3.自动扫描
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:tx="http://www.springframework.org/schema/tx" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 10 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd" default-autowire="byName"> 11 12 <!-- 配置扫描路径 --> 13 <context:component-scan base-package="com.bean4"></context:component-scan> 14 15 </beans>
3.注解方式:举例我所接触的注解
@component :标识为spring组件,由spring容器管理
@Autowired:设置自动注入bean。 默认名字为与当前bean的类一致,首字母小写。
@Service:业务层Bean。一般作用于服务层的类,dao层,service层
@Controller:展示层Bean。一般用于控制层的类,controller层
@Repository:应存储层Bean。一般用于model层的类
详细的可以参照: Spring 注解总结
步骤:
1.下载相应的jar包。搭建环境。本人用的是:spring-framework-4.0.0.RELEASE-dist
2.新建java工程:在工程的根目录新建 lib目录,将相关jar导入
3.创建bean
Goods
1 package com.bean; 2 3 public class Goods { 4 5 private int gid; 6 private int gprice; 7 private int gnum; 8 public int getGid() { 9 return gid; 10 } 11 public void setGid(int gid) { 12 this.gid = gid; 13 } 14 public int getGprice() { 15 return gprice; 16 } 17 public void setGprice(int gprice) { 18 this.gprice = gprice; 19 } 20 public int getGnum() { 21 return gnum; 22 } 23 public void setGnum(int gnum) { 24 this.gnum = gnum; 25 } 26 27 }
Person
1 package com.bean; 2 3 public class Person { 4 5 private String name; 6 private int age; 7 public String getName() { 8 return name; 9 } 10 public void setName(String name) { 11 this.name = name; 12 } 13 public int getAge() { 14 return age; 15 } 16 public void setAge(int age) { 17 this.age = age; 18 } 19 20 }
Users
1 package com.bean; 2 3 public class Users { 4 5 private int uid ; 6 private String uname; 7 private int umoney; 8 public int getUid() { 9 return uid; 10 } 11 public void setUid(int uid) { 12 this.uid = uid; 13 } 14 public String getUname() { 15 return uname; 16 } 17 public void setUname(String uname) { 18 this.uname = uname; 19 } 20 public int getUmoney() { 21 return umoney; 22 } 23 public void setUmoney(int umoney) { 24 this.umoney = umoney; 25 } 26 27 }