1.1. spring概述:
1.1.1 spring介绍 :
Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control : 反转控制) 和 AOP(Aspect Oriented Programming : 面向切面编程)
为内核,提供了展现层SpringMVC和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,成为使用最多的JavaEE企业开源框架.
1.1.3 spring的优势
方便解耦,简化开发.
通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过渡程序耦合.用户也不必再为单例模式类,属性文件解析等这些很底层的需求编写代码,
可以更专注于上层的应用.
AOP编程的支撑
通过Spring的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付.
声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量.
方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的的测试工作,测试不再是昂贵的操作,而是随手可做的事情.
方便集合各种优秀框架
Spring可以降低各种框架的使用难度,提供了对各种优秀框架(Struts,Hibernate,Hessian,Quartz等)的直接支持.
降低JavaEE API的使用难度
Spring对JavaEE API(如JDBC,JavaMail,远程调用等)进行了薄薄的封装层,是这些API的使用难度大为降低.
Java源码是经典学习范例
Spring的源代码设计精妙,结构清晰,匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣.它的源代码无意是Java技术的最佳实践的范例. 1.1.4 spring的体系结构 1.2 程序的耦合和解耦:
1.2.1 什么是程序的耦合
类之间不可避免的产生依赖关系,这种依赖关系称之为耦合. 在开发中,理想的状态应该是 :
我们应该尽力达到的 : 编译时不依赖,运行时才依赖.
1.2.2 解决程序耦合的思路 :
使用配置文件
1.2.3 工厂模式解耦:
在实际开发中我们把所有的dao和service和action对象使用配置文件配置起来,当启动服务器应用加载的时候,通过读取配置文件,
把这些对象创建出来并存起来.在接下来的使用的时候,直接拿过来用就好了. 1.2.4 控制反转 (Inversion Of Control)
IOC技术 : 出现的目的解决耦合性过高的问题.
IOC : 控制反转,将对象的创建的权利反转给Spring框架.
控制反转,它是spring框架的核心之一。
它的作用只有一个:削减计算机程序的耦合。 1.3 入门的步骤: IOC的入门
1.3.1 创建web工程,下载Spring的jar包
1.3.2 在工程中导入IOC需要的jar包(6个)
1.3.3 编写UserDao接口和UserDaoImpl实现类
1.3.4 把UserDaoImpl交给Spring的IOC容器管理,其实编写配置文件即可.
在src目录下创建applicationContext.xml配置
导入约束
配置UserDaoImpl
<!-- 管理实现类的 -->
<bean id="ud" class="com.baidu.demo1.UserDaoImpl"></bean>
1.3.5 创建Spring的工厂,加载applicationContext.xml配置文件,从工厂中获取到UserBean对象,调用方法.
public void run1() {
//创建工厂,加载applicationContext.xml配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//从工厂中获取到对象
UserDao dao = (UserDao)ac.getBean("ud");
//调用对象的方法
dao.login();
} 3.1 Spring基于XML的IOC细节
3.1.1 BeanFactory和ApplicationContext的区别
BeanFactory才是Spring容器中的顶层接口.
ApplicationContext是它的子接口.
BeanFactory和ApplicationContext的区别:
创建对象的时间点不一样.
ApplicationContext : 只要一读取配置文件,默认情况下就会创建对象.
BeanFactory : 什么时候使用什么时候创建对象.
ClassPathXmlApplicationContext : 是加载相对路径,就是项目下的路径.
FileSystemXmlApplicationContext : 是加载绝对路径,就是把xml文件放在任意磁盘下都可以加载. 3.1.2 bean标签 : IOC容器bean的管理,管理实现类的.把实现类交给IOC容器创建维护
id : 自己起唯一的名称
class : 管理类的全路径(包名+类名)
scope : 创建后对象的作用的范围
singleton : 单例的,默认值 (所谓单例:就是在内存中只有这一个对象) scope="singleton"
一个应用只有一个对象的实例。它的作用范围就是整个引用。
生命周期:
对象出生:当应用加载,创建容器时,对象就被创建了。
对象活着:只要容器在,对象一直活着。
对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
prototype : 多例的
每次访问对象时,都会重新创建对象实例。
生命周期:
对象出生:当使用对象时,创建新的对象实例。
对象活着:只要对象在使用中,就一直活着。
对象死亡:当对象长时间不用时,被java的垃圾回收器回收了。
了解的以下都是多例的
request : WEB项目中,Spring创建一个Bean的对象,将对象存入到request域中.
session : WEB项目中,Spring创建一个Bean的对象,将对象存入到session域中.
globalSession : 全局的session(可以在多个服务器之间共享数据) WEB项目中,应用在Portlet环境.如果没有Portlet环境那么globalSession相当于session.
init-method : 初始化方法
destroy-method : 销毁的方法 3.2.3 实例化的Bean的三种方式:
第一种方式:使用默认无参构造函数
<!--在默认情况下:
它会根据默认无参构造函数来创建类对象。如果bean中没有默认无参构造函数,将会创建失败。
-->
<bean id="customerService" class="com.baidu.service.impl.CustomerServiceImpl"/> 第二种方式:spring管理静态工厂-使用静态工厂的方法创建对象
/**
* 模拟一个静态工厂,创建业务层实现类
*/
public class StaticFactory {
public static ICustomerService createCustomerService(){
return new CustomerServiceImpl();
}
}
<!-- 此种方式是:
使用StaticFactory类中的静态方法createCustomerService创建对象,并存入spring容器
id属性:指定bean的id,用于从容器中获取
class属性:指定静态工厂的全限定类名
factory-method属性:指定生产对象的静态方法
-->
<bean id="customerService"
class="com.baidu.factory.StaticFactory"
factory-method="createCustomerService"></bean> 第三种方式:spring管理实例工厂-使用实例工厂的方法创建对象
/**
* 模拟一个实例工厂,创建业务层实现类
* 此工厂创建对象,必须现有工厂实例对象,再调用方法
*/
public class InstanceFactory {
public ICustomerService createCustomerService(){
return new CustomerServiceImpl();
}
}
<!-- 此种方式是:
先把工厂的创建交给spring来管理。
然后在使用工厂的bean来调用里面的方法
factory-bean属性:用于指定实例工厂bean的id。
factory-method属性:用于指定实例工厂中创建对象的方法。
-->
<bean id="instancFactory" class="com.baidu.factory.InstanceFactory"></bean>
<bean id="customerService"
factory-bean="instancFactory"
factory-method="createCustomerService"></bean> 3.3 spring依赖注入
3.3.1 依赖注入的概念 :
它是spring框架核心,ioc的具体实现方式.简单的说,就是坐等框架把对象传入,而不用我们自己
去获取. 3.3.2 依赖注入 :
依赖 : service成功运行的话,需要用到dao,service依赖dao.
注入 : service和dao都交给了IOC容器管理,把dao对象传入到service对象中呢? 3.3.2.1 构造函数注入
使用类中的构造函数,给成员变量赋值.注意,赋值的操作不是我们自己做的,而是通过配置的方式,让spring
框架来为我们注入.
如下:
/**
*/
public class CustomerServiceImpl implements ICustomerService { private String name;
private Integer age;
private Date birthday; public CustomerServiceImpl(String name, Integer age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
} @Override
public void saveCustomer() {
System.out.println(name+","+age+","+birthday);
}
} <!-- 使用构造函数的方式,给service中的属性传值
要求:
类中需要提供一个对应参数列表的构造函数。
涉及的标签:
constructor-arg
属性:
index:指定参数在构造函数参数列表的索引位置
type:指定参数在构造函数中的数据类型
name:指定参数在构造函数中的名称 用这个找给谁赋值 =======上面三个都是找给谁赋值,下面两个指的是赋什么值的============== value:它能赋的值是基本数据类型和String类型
ref:它能赋的值是其他bean类型,也就是说,必须得是在配置文件中配置过的bean
-->
<bean id="customerService" class="com.baidu.service.impl.CustomerServiceImpl">
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean> <bean id="now" class="java.util.Date"></bean> 3.3.3 set方法注入
就是在类中提供需要注入成员的set方法。具体代码如下:
/**
*/
public class CustomerServiceImpl implements ICustomerService { private String name;
private Integer age;
private Date birthday; public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
} @Override
public void saveCustomer() {
System.out.println(name+","+age+","+birthday);
}
} <!-- 通过配置文件给bean中的属性传值:使用set方法的方式
涉及的标签:
property
属性:
name:找的是类中set方法后面的部分
ref:给属性赋值是其他bean类型的
value:给属性赋值是基本数据类型和string类型的
实际开发中,此种方式用的较多。
-->
<bean id="customerService" class="com.baidu.service.impl.CustomerServiceImpl">
<property name="name" value="test"></property>
<property name="age" value="21"></property>
<property name="birthday" ref="now"></property>
</bean> <bean id="now" class="java.util.Date"></bean> 3.3.4 使用p名称空间注入数据(本质还是调用set方法)
此种方式是通过在xml中导入p名称空间,使用p:propertyName来注入数据,它的本质仍然是调用类中的set方法实现注入功能。
Java类代码:
/**
* 使用p名称空间注入,本质还是调用类中的set方法
*/
public class CustomerServiceImpl4 implements ICustomerService { private String name;
private Integer age;
private Date birthday; public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public void saveCustomer() {
System.out.println(name+","+age+","+birthday);
}
}
配置文件代码:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="customerService"
class="com.baidu.service.impl.CustomerServiceImpl4"
p:name="test" p:age="21" p:birthday-ref="now"/>
</bean> 3.3.5 注入集合属性
就是给类中的集合成员传值,它用的也是set方法注入的方式,只不过变量的数据类型都是集合.
/**
*/
public class CustomerServiceImpl implements ICustomerService { private String[] myStrs;
private List<String> myList;
private Set<String> mySet;
private Map<String,String> myMap;
private Properties myProps; public void setMyStrs(String[] myStrs) {
this.myStrs = myStrs;
}
public void setMyList(List<String> myList) {
this.myList = myList;
}
public void setMySet(Set<String> mySet) {
this.mySet = mySet;
}
public void setMyMap(Map<String, String> myMap) {
this.myMap = myMap;
}
public void setMyProps(Properties myProps) {
this.myProps = myProps;
} @Override
public void saveCustomer() {
System.out.println(Arrays.toString(myStrs));
System.out.println(myList);
System.out.println(mySet);
System.out.println(myMap);
System.out.println(myProps);
}
} <!-- 注入集合数据
List结构的:
array,list,set
Map结构的
map,entry,props,prop
-->
<bean id="customerService" class="com.baidu.service.impl.CustomerServiceImpl">
<!-- 在注入集合数据时,只要结构相同,标签可以互换 -->
<!-- 给数组注入数据 -->
<property name="myStrs">
<set>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</set>
</property>
<!-- 注入list集合数据 -->
<property name="myList">
<array>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</array>
</property>
<!-- 注入set集合数据 -->
<property name="mySet">
<list>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</list>
</property>
<!-- 注入Map数据 -->
<property name="myMap">
<props>
<prop key="testA">aaa</prop>
<prop key="testB">bbb</prop>
</props>
</property>
<!-- 注入properties数据 -->
<property name="myProps">
<map>
<entry key="testA" value="aaa"></entry>
<entry key="testB">
<value>bbb</value>
</entry>
</map>
</property>
</bean>

SSH框架之Spring第一篇的更多相关文章

  1. SSH框架之Spring第二篇

    1.1 基于注解的IOC配置 既注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦合.只是配置的形式不一样. 1.2 环境搭建 1.2.1 第一步:拷贝必备的jar包 需要多拷贝一个sp ...

  2. SSH框架之Struts2第一篇

    1.2 Struts2的概述 : Struts2是一个基于MVC设计模式的WEB层的框架. 1.2.1 常见web层框架 Struts1,Struts2,WebWork,SpringMVC Strut ...

  3. SSH框架之Hibernate第一篇

    1.2Hibernate的概述: 1.2.1 什么Hibernate? Hibernate(开发源代码的对象关系映射框架)是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它 ...

  4. Maven环境下搭建SSH框架之Spring整合Hibernate

    © 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Spring:4.3.8.RELEASE Hibernate:5.1.7.Final MySQL:5.7.17 注意:其他版本在某些特性 ...

  5. spring 第一篇(1-1):让java开发变得更简单(下)转

    spring 第一篇(1-1):让java开发变得更简单(下) 这个波主虽然只发了几篇,但是写的很好 上面一篇文章写的很好,其中提及到了Spring的jdbcTemplate,templet方式我之前 ...

  6. 初学Java ssh之Spring 第一篇

    之前虽然毕业前实习的工作是使用的C# .NET语言,但是,毕业后还是果断应聘Java.虽然自己对Java的理解不如C#深入,只是对基础知识比较熟悉,但还是义无返顾了··· 虽然应聘经历比较坎坷,但最终 ...

  7. Spring第一篇

    我计划用3到五篇文章来描述Spring,这是第一篇 1 . 什么是Spring Spring 是一个开源框架,Spring 是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnso ...

  8. SSH框架中spring的原理

    在ssh项目中,是有明确分工的,spring的作用就相当于将struts和hibernate连接起来,是将两个没有关系的框架的特性,方法,action都放在spring的配置文件中使他们建立关系.取他 ...

  9. Eclipse搭建SSH框架(Struts2+Spring+Hibernate)

    见识少的我经过一天多的研究才知道,在MyEclipse中搭好的框架的配置文件和jar包是通用的.接下来——亮剑! 工具:Eclipse+Tomcat+Mysql 一.先在Eclipse中配置好Tomc ...

随机推荐

  1. GrimTheRipper: 1 Vulnhub Walkthrough

    靶机下载: https://www.vulnhub.com/entry/grimtheripper-1,350/ 主机层面端口扫描: ╰─ nmap -p1-65535 -A 10.10.202.15 ...

  2. 流式计算(二)-Kafka Stream

    前面说了Java8的流,这里还说流处理,既然是流,比如水流车流,肯定得有流的源头,源可以有多种,可以自建,也可以从应用端获取,今天就拿非常经典的Kafka做源头来说事,比如要来一套应用日志实时分析框架 ...

  3. js自带的对数组中的操作

    这篇是我自己总结的,是我自己平常使用的不是很多的数组方法,而且都是js自带的,像大家经常使用的push.pop方法就没写里面.废话不多说,直接看代码 <!DOCTYPE html> < ...

  4. Dynamics CRM 2013开始推出的服务器端同步来配置邮件服务

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  5. JavaWeb 错误/异常时页面提示

    经常我们会遇到发生页面404错误,服务器 500 异常,如果默认方式处理,则是将异常捕获之后跳到 Tomcat 缺省的异常页面,如下图所示.

  6. Android 非法字符:'/ufeff'

    [问题来源] 不知道大家有没有做过这样的事,在Android开发的过程中,通过文本直接修改代码,不打开编译器,然后提交让同时编译运行.这时Android编译就会报错,指定修改的文件开始位置,显示非法字 ...

  7. SpringCloud之Zuul:服务网关

    Zuul在Web项目中的使用见上文<SpringBoot中使用Zuul>,下面例子为Zuul在Spring Cloud的使用. 开发工具:IntelliJ IDEA 2019.2.3 一. ...

  8. Virtual Box复制虚拟机

    用惯了VM换BOX还是有点不大一样的,比如复制 我用了2个网卡,所以看起来麻烦了一次 注释了UUID 应该有更好的办法来操作,下面的看起来有点啰嗦,先凑合着这样弄... 1.关机 2.复制 3.改名称 ...

  9. MySQL能否授予查看存储过程定义权限给用户

    在其他RDBMS中,可以将查看某个存储过程(PROCEDURE)定义的权限给某个用户,例如在SQL Server中,可以单独将查看ProcedureName定义的权限授予UserA GRANT VIE ...

  10. enable SSL on weblogic

    To provision (install) a certificate on the server On the Start menu, click Run, and in the Open box ...