Spring入门学习创智版(一)

历史回顾

struts:web层,比较简单(ValueStack值栈,拦截器)
hibernate:dao层,知识点杂
spring:service层,重要,讲多少用多少 --> 【了解】
在这里插入图片描述

:基础(IoC控制反转、DI依赖注入)、整合Junit、整合web
:AOP切面编程、JdbcTemplate
:事务管理、SSH整合

1、spring框架概述

1.1 什么是spring
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

轻量级:与EJB对比,依赖资源少,销毁的资源少。
分层: 一站式,每一个层都提供的解决方案

web层strutsspring-MVC
service层spring
dao层hibernatemybatis
jdbcTemplate --> spring-data

1.2 spring由来
Expert One-to-One J2EE Design and Development
Expert One-to-One J2EE Development without EJB

1.3 spring核心
Spring的核心是 控制反转(IoC)面向切面(AOP)

1.4 spring优点
在这里插入图片描述
1.5 spring体系结构
在这里插入图片描述

搭建spring环境

下载jar包 spring-framework-4.3.9.RELEASE-dist.zip
点击进入

解压后,取
(1) spring-aop-4.3.9.RELEASE.jar 开发AOP特性需要的jar
(2) spring-beans-4.3.9.RELEASE.jar 处理bean的jar
(3) spring-context-4.3.9.RELEASE.jar 处理spring上下文的jar
(4) spring-core-4.3.9.RELEASE.jar spring 核心jar
(5) spring-expression-4.3.9.RELEASE.jar spring 表达式
开发至少需要这5个+
1个第三方提供的commons-logging-1.1.1.jar 日志
(下载地址:
https://mvnrepository.com/artifact/commons-logging/commons-logging/1.1.1
)

下载 STS.exe
参考博客:点击进入

2、入门案例:IoC【掌握】

2.1 导入jar包
4 + 1 : 4个核心(beans、core、context、expression) + 1个依赖(commons-loggins…jar)
在这里插入图片描述

注意:jar包类型
在这里插入图片描述
2.2 目标类
提供UserService接口和实现类
获得UserService实现类的实例
之前开发中,直接new一个对象即可。
学习spring之后,将由Spring创建对象实例–> IoC 控制反转(Inverse of Control)之后需要实例对象时,从spring工厂(容器)中获得,需要将实现类的全限定名称配置到xml文件中
在这里插入图片描述
在这里插入图片描述
2.3 配置文件
位置:任意,开发中一般在classpath下(src)
名称:任意,开发中常用applicationContext.xml
内容:添加schema约束
约束文件位置:spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\ xsd-config.html
在这里插入图片描述
2.4 测试
在这里插入图片描述

3、入门案例:DI【掌握】

DI Dependency Injection ,依赖注入
is a :是一个,继承。
has a:有一个,成员变量,依赖。

class B {
           private A a;   //B类依赖A类
        }

依赖:一个对象需要使用另一个对象
注入:通过setter方法进行另一个对象实例设置。

例如:

class BookServiceImpl{
        //之前开发:接口 = 实现类  (service和dao耦合)
		//private BookDao bookDao = new BookDaoImpl();
 		//spring之后 (解耦:service实现类使用dao接口,不知道具体的实现类)
		private BookDao bookDao;
		setter方法
   }

模拟spring执行过程
创建service实例:BookService bookService = new BookServiceImpl() -->IoC
创建dao实例:BookDao bookDao = new BookDaoImple() -->IoC
将dao设置给service:bookService.setBookDao(bookDao); -->DI

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


3.1 目标类
创建BookService接口和实现类
创建BookDao接口和实现类
将dao和service配置 xml文件
使用api测试

3.1.1 dao
在这里插入图片描述
3.1.2 service
在这里插入图片描述
在这里插入图片描述
3.2 配置文件
在这里插入图片描述
在这里插入图片描述
3.3 测试
在这里插入图片描述

4、myeclipse schema xml提示

步骤一:确定xsd文件位置
spring-framework-3.2.0.RELEASE\schema\beans
在这里插入图片描述
步骤二:复制路径
在这里插入图片描述
步骤三:搜索“xml catalog”
在这里插入图片描述
步骤四:添加约束提示
在这里插入图片描述

5、核心API

api整体了解,之后不使用,在学习过程需要。
在这里插入图片描述
BeanFactory :这是一个工厂,用于生成任意bean。
采取延迟加载,第一次getBean时才会初始化Bean

ApplicationContext:是BeanFactory的子接口,功能更强大。
(国际化处理、事件传递、Bean自动装配、各种不同应用层的Context实现)。

当配置文件被加载,就进行对象实例化。
ClassPathXmlApplicationContext 用于加载classpath(类路径、src)下的xml
加载xml运行时位置 --> /WEB-INF/classes/…xml

FileSystemXmlApplicationContext 用于加载指定盘符下的xml
加载xml运行时位置 --> /WEB-INF/…xml
通过java web ServletContext.getRealPath() 获得具体盘符

在这里插入图片描述

6、装配Bean 基于XML

6.1 实例化方式
3种bean实例化方式默认构造静态工厂实例工厂
在这里插入图片描述

6.1.1默认构造
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6.1.2静态工厂
常用与spring整合其他框架(工具)
静态工厂:用于生成实例对象,所有的方法必须是static

共有的:
在这里插入图片描述
在这里插入图片描述

测试类
在这里插入图片描述
6.1.3 实例工厂
实例工厂:必须先有工厂实例对象,通过实例对象创建对象。提供所有的方法都是“非静态”的。

在这里插入图片描述
在这里插入图片描述
测试类
在这里插入图片描述
6.3 作用域
作用域:用于确定spring创建bean实例个数。
在这里插入图片描述
取值
singleton 单例,默认值。
prototype 多例,每执行一次getBean将获得一个实例。例如:struts整合spring,配置action多例。

在这里插入图片描述

UserService.java
在这里插入图片描述
UserServiceImpl.java

在这里插入图片描述
bean.xml
在这里插入图片描述

测试类
在这里插入图片描述

6.4 生命周期
6.4.1初始化和销毁
目标方法执行前后执行后,将进行初始化或销毁。
在这里插入图片描述
在这里插入图片描述
UserService.java
在这里插入图片描述
UserServiceImpl.java

在这里插入图片描述
在这里插入图片描述

测试类
在这里插入图片描述
6.4.2 BeanPostProcessor 后处理Bean
spring 提供一种机制,只要实现此接口BeanPostProcessor,并将实现类提供给spring容器,spring容器将自动执行,在初始化方法前执行before(),在初始化方法后执行after() 。

配置<bean class="">

在这里插入图片描述
Factory hook(勾子) that allows for custom modification of new bean instances, e.g. checking for marker interfaces or wrapping them with proxies.

spring提供工厂勾子,用于修改实例对象,可以生成代理对象,是AOP底层。

模拟

A a =new A();
a = B.before(a)			--> 将a的实例对象传递给后处理bean,可以生成代理对象并返回。
a.init();
a = B.after(a);

a.addUser();		//生成代理对象,目的在目标方法前后执行(例如:开启事务、提交事务)

a.destroy()

在这里插入图片描述
测试类
在这里插入图片描述
bean.xml里添加这个
在这里插入图片描述

6.5 属性依赖注入

依赖注入方式:手动装配 和 自动装配
手动装配:一般进行配置信息都采用手动
基于xml装配:构造方法、setter方法
基于注解装配
自动装配:struts和spring 整合可以自动装配
byType:按类型装配
byName:按名称装配
constructor构造装配,
auto: 不v确定装配。
在这里插入图片描述

6.5.1 构造方法

User,java


package com.itheima.f_xml.a_construtor;

public class User {
	private Integer uid;
	private String name;
	private Integer age;

	/**
	 * 多个构造方法
	 */
	public User(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}

	public User(Integer uid, String name) {
		super();
		this.uid = uid;
		this.name = name;
	}

	public User(Integer uid, String name, Integer age) {
		super();
		this.uid = uid;
		this.name = name;
		this.age = age;
	}

	public Integer getUid() {
		return uid;
	}

	public void setUid(Integer uid) {
		this.uid = uid;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "[User uid=" + uid + ",name=" + name + ",age=" + age + "]";
	}
}

bean.xml
在这里插入图片描述
测试类
在这里插入图片描述
6.5.2 setter方法
Person.java

package com.itheima.f_xml.b_setter;

public class Person {
	
	private String pname;
	private Integer age;
	
	private Address homeAddr;		//家庭地址
	private Address companyAddr;	//公司地址
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public Address getHomeAddr() {
		return homeAddr;
	}
	public void setHomeAddr(Address homeAddr) {
		this.homeAddr = homeAddr;
	}
	public Address getCompanyAddr() {
		return companyAddr;
	}
	public void setCompanyAddr(Address companyAddr) {
		this.companyAddr = companyAddr;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "姓名:"+pname+"\n年龄:"+age+"\n"+homeAddr+"\n"+companyAddr;
	}
}

Address.java

package com.itheima.f_xml.b_setter;

public class Address {
	
	private String addr;	//地址信息
	private String tel;		//电话
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public String getTel() {
		return tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "地址:"+addr+"\t电话:"+tel;
	}
}

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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">

	<!-- 
	setter方法注入
		*普通数据	<property name="" value=""/>
				等效于:
				<property name="">
					<value></value>
				</property>	
		*引用数据	<property name="" ref="另外一个bean的Id"/>	
				等效于:
				<property name="">
					<ref bean="另外一个bean的Id"/>
				</property>
	-->
	
	<!-- main -->
	<bean id="personId" class="com.itheima.f_xml.b_setter.Person">
		<!-- 普通数据 -->
		<property name="pname" value="jack"/>
		<property name="age">
			<value>18</value>
		</property>
		
		<!-- 引用数据 -->
		<property name="homeAddr" ref="homeAddrId"/>
		<property name="companyAddr">
			<ref bean="CompanyAddrId"/>
		</property>
	</bean>
	
	
	
	<bean id="homeAddrId" class="com.itheima.f_xml.b_setter.Address">
		<property name="addr" value="北京"/>
		<property name="tel" value="110"/>
	</bean>
	<bean id="CompanyAddrId" class="com.itheima.f_xml.b_setter.Address">
		<property name="addr" value="上海"/>
		<property name="tel" value="120"/>
	</bean>
</beans>

测试类

在这里插入图片描述
6.5.3 P命令空间[了解]
对“setter方法注入”进行简化,替换,而是在

<bean p:属性名="普通值"  p:属性名-ref="引用值">

p命名空间使用前提,必须添加命名空间
在这里插入图片描述在这里插入图片描述

6.5.2的beam.xml也可以这样子写

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="personId" class="com.itheima.f_xml.c_p.Person"
	p:pname="mark" p:age="22"
	p:homeAddr-ref="homeAddrId" p:companyAddr-ref="CompanyAddrId">
	</bean>	
	
	<bean id="homeAddrId" class="com.itheima.f_xml.c_p.Address"
			p:addr="北京" p:tel="110">
	</bean>
	<bean id="CompanyAddrId" class="com.itheima.f_xml.c_p.Address"
		p:addr="上海" p:tel="120">
	</bean>
</beans>

6.5.4 SpEL[了解]
对进行统一编程,所有的内容都使用value

<property name="" value="#{表达式}">
	#{123}、#{'jack'} : 数字、字符串
	#{beanId}	:另一个bean引用
	#{beanId.propName}	:操作数据
	#{beanId.toString()}	:执行方法
	#{T().字段|方法}	:静态方法或字段

在这里插入图片描述

Customer.java

package com.itheima.f_xml.d_spel;

public class Customer {

	private String cname="java";
	private Double pi;

	public String getCname() {
		return cname;
	}

	public void setCname(String cname) {
		this.cname = cname;
	}

	public Double getPi() {
		return pi;
	}

	public void setPi(Double pi) {
		this.pi = pi;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "[Customer cname=" + cname + ",pi=" + pi + "]";
	}
}

bean.xml
在这里插入图片描述
测试类
在这里插入图片描述
6.5.5 集合注入
在这里插入图片描述

package com.itheima.f_xml.e_coll;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class CollData {
	private String[] arrayData;
	private List<String> listData;
	private Set<String> setData;
	private Map<String, String> mapData;
	private Properties prosData;

	public String[] getArrayData() {
		return arrayData;
	}

	public void setArrayData(String[] arrayData) {
		this.arrayData = arrayData;
	}

	public List<String> getListData() {
		return listData;
	}

	public void setListData(List<String> listData) {
		this.listData = listData;
	}

	public Set<String> getSetData() {
		return setData;
	}

	public void setSetData(Set<String> setData) {
		this.setData = setData;
	}

	public Map<String, String> getMapData() {
		return mapData;
	}

	public void setMapData(Map<String, String> mapData) {
		this.mapData = mapData;
	}

	public Properties getProsData() {
		return prosData;
	}

	public void setProsData(Properties prosData) {
		this.prosData = prosData;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "arrayData="+Arrays.asList(arrayData)+"\n"+
				"listData="+listData+"\n"+
				"setData="+setData+"\n"+
				"mapData="+mapData+"\n"+
				"prosData="+prosData+"\n"
				;
	}
}

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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="collDataId" class="com.itheima.f_xml.e_coll.CollData">
		<!-- 数组 -->
		<property name="arrayData">
			<array>
				<value>DS</value>
				<value>DZD</value>
			</array>
		</property>
		
		<!-- 列表 -->
		<property name="listData">
			<list>
				<value>LB</value>
				<value>LB2</value>
			</list>
		</property>

		<!-- 集合 -->
		<property name="setData">
			<set>
				<value>JH</value>
				<value>JH2</value>
			</set>
		</property>
		
		<!-- Map 键值对-->
		<property name="mapData">
			<map>
				<entry key="jack" value="杰克"></entry>
				<entry>
					<key><value>mark</value></key>
					<value>麦克</value>
				</entry>
			</map>
		</property>
		
		<!-- property -->
		<property name="prosData">
			<props>
				<prop key="PRO1">pro1</prop>
				<prop key="PRO2">pro2</prop>
			</props>
		</property>		
	</bean>
	
</beans>

测试类
在这里插入图片描述

7、装配Bean 基于注解(重点)

注解:就是一个类,使用@注解名称
开发中:使用注解 取代 xml配置文件

在这里插入图片描述

注解使用前提,添加命名空间,让spring扫描含有注解类
在这里插入图片描述
bean.xml(下面两个案例都是这个.xml)
在这里插入图片描述
离线文档:
spring-framework-4.3.9.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html

在这里插入图片描述
整个代码覆盖获者将黑色部分黏贴在bean.xml头部
在这里插入图片描述

案例一
UserService.java
在这里插入图片描述UserServiceImpl.java

在这里插入图片描述测试类
在这里插入图片描述

案例二
StudentAction.java
在这里插入图片描述StudentDao.java
在这里插入图片描述StudentDaoImpl.java

在这里插入图片描述StudentService.java
在这里插入图片描述StudentServiceImpl.java

package com.itheima.g_annotation.b_web;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

@Service("studentServiceId")
//@Scope("prototype")
public class StudentServiceImpl implements StudentService {

	private StudentDao studentDao;

	@Autowired
	@Qualifier("studentDaoId")
	public void setStudentDao(StudentDao studentDao) {
		this.studentDao = studentDao;
	}
	
	@Override
	public void addStudent() {
		// TODO Auto-generated method stub
		System.out.println("service");
	}
	
	@PostConstruct
	public void myInit() {
		// TODO Auto-generated method stub
		System.out.println("初始化");
	}
	
	@PreDestroy
	public void myDestroy() {
		// TODO Auto-generated method stub
		System.out.println("销毁");
	}

}

测试类
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章