文章目录
框架概述
Rod Johnson创的开源框架
Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于J2EE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC
总结
-
Spring是轻量级的开源的JavaEE,框架
-
Spring可以解决企业应用开发的复杂性
-
Spring有两个核心部分:IOC和 Aop
(1)IOC:控制反转,把创建对象过程交给Spring进行管理(2) Aop:面向切面,不修改源代码进行功能增强
补充Spring特点
- 方便解耦,简化开发
- Aop,编程支持
- 方便程序测试
- 方便和其他框架进行整合
- 方便进行事务操作
- 降低API开发难度。
入门案例
下载sping相关jar包
通过百度网盘分享的文件:commons-…等2个文件
链接:https://pan.baidu.com/s/1bUMlbUkdaXbor1EOD8r9Jg
提取码:9o4m
复制这段内容打开「百度网盘APP 即可获取」
常用jar包
导入jar包到idea
先创建普通Java工程
创建lib目录用于存放jar包
然后 citr + c 复制那5个jar包 ,再然后citr + v复制到创建的lib目录里面
导入jar包
选要用的5个jar包,然后点ok
先点Apply,再点ok
创建User类
public class User {
public void add(){
System.out.println("add方法执行了");
}
}
xml文件配置
测试类
public class Test {
public static void main(String[] args) {
//加载xml配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");//类 全路径 xml 应用 文本
//通过配置文件里面的id值,找到创建的对象(这个对象在加载xml文件时就创建了)
User user1 = context.getBean("user1", User.class);
user1.add();
}
}
IOC容器
底层原理1:IOC(概念和原理)
-
什么是IOC
(1)控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理(2)使用IOC目的:为了耦合度降低
(3) 做入门案例就是IOC实现 -
IOC底层原理
(1) xml解析、工厂模式、反射 -
画图讲解IOC底层原理
底层原理2:IOC的接口
- IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
- Spring提供I0C容器实现两种方式:(两个接口)
(1) BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用-加载配置文件时候不会创建对象,在获取对象〈使用)才去创建对象
(2) ApplicationContext:是BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用,加载配置文件时候就会把在配置文件对象进行创建 - ApplicationContext 接口有实现类
IOC容器-Bean管理-XML方式
什么是Bean管理
Bean管理指的是两个操作
- Spring创建对象
- Spirng注入属性(设置属性)
Bean管理操作有两种方式
- 基于xml配置文件方式实现
- 基于注解方式实现
IOC操作bean管理
用XML的方式创建对象
<bean id="user1" class="com.hxp.spring_5.User"></bean>
(1)在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建.
(2)在bean标签有很多属性,介绍常用的属性
*id属性:唯一标识创建的对象
*class属性:类全路径(包类路径)。
(3)创建对象时候,默认也是执行无参数构造方法完成对象创建
用XML的方式注入属性
DI:依赖注入,就是注入属性((面试可能会问DI和IOC的区别)
第一种注入方式:使用set方法进行注入
(本质上是调用的set方法设置属性值)
(1) 先要创建类,定义属性和对应的set方法
private String bname;
private String bauthor;
public void setBname(String bname) {
this.bname = bname;
}
public void setBauthor(String bauthor) {
this.bauthor = bauthor;
}
(2)然后在xml文件中配置对象创建,配置属性注入
<bean id="book" class="com.hxp.spring_5.book">
<property name="bname" value="完美世界"></property>
<property name="bauthor" value="辰东"></property>
</bean>
第二种注入方式:使用有参数构造进行注入
(1)先创建有参构造器
public Orders(String oname, String address) {
this.oname = oname;
this.address = address;
}
(2)然后在xml里面配置,创建对象和设置属性
<bean id="orders" class="com.hxp.spring_5.Orders">
<constructor-arg name="oname" value="gg"></constructor-arg>
<constructor-arg name="address" value="12345"></constructor-arg>
</bean>
通过p命名空间注入
(1)添加p名称空间在配置文件中
xmlns:p="http://www.springframework.org/schema/p"
(2)设置属性,在Bean标签里面因为刚刚添加了p名称空间所以可以通过p设置
<bean id="book" class="com.hxp.spring_5.Book" p:bname="完美世界" p:bauthor="辰东">
</bean>
xml注入其他类型的属性
1.字面量
(1)null
<bean id="book" class="com.hxp.spring_5.Book">
<property name="bname">
<null/>
</property>
<property name="bauthor">
<null/>
</property>
</bean>
(2)属性值包含特殊符号
<bean id="book" class="com.hxp.spring_5.Book">
//1.转义方式
<property name="bname" value="<<Java>>">
</property>
//2.CDATA方式
<property name="bauthor">
<value><![CDATA[<<南京>>]]></value>
</property>
</bean>
xml注入属性-外部bean
- 创建两个类service类和dao类
public class UserDaoIpml implements UserDao{
public void add(){
System.out.println("dao……add");
}
}
public class UserService {
private UserDaoIpml userDaoIpml;
public void setUserDaoIpml(UserDaoIpml userDaoIpml) {
this.userDaoIpml = userDaoIpml;
}
public void serviceAdd(){
System.out.println("service……add");
userDaoIpml.add();
}
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean2.xml");
//UserDaoIpml dao = context.getBean("dao", UserDaoIpml.class);
UserService ser = context.getBean("ser", UserService.class);
ser.serviceAdd();
}
}
- 在 service 调用dao里面的方法
public void serviceAdd(){
System.out.println("service……add");
userDaoIpml.add();
}
- 在spring配置文件中进行配置。
<?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="ser" class="com.hxp.service.UserService">
<property name="userDaoIpml" ref="dao"></property>
</bean>
<bean id="dao" class="com.hxp.dao.UserDaoIpml">
</bean>
</beans>
xml注入属性-内部bean和级联赋值
(1)一对多关系:部门和员工
一个部门有多个员工,一个员工属于一个部门部门是一,员工是多。
(2) 在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示
代码
//1.创建dept部门类
public class Dept {
private String dname;
public void setDname(String dname) {
this.dname = dname;
}
@Override
public String toString() {
return "Dept{" +
"dname='" + dname + '\'' +
'}';
}
}
<?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">
//3.1.创建对象和设置属性 -- 方法一 -- 内部级联
<bean id="emp1" class="com.hxp.bean.Emp">
<property name="ename" value="血小板"></property>
<property name="gender" value="女"></property>
<property name="dept">
<bean id="dept1" class="com.hxp.bean.Dept">
<property name="dname" value="血管部门"></property>
</bean>
</property>
</bean>
//3.2.创建对象和设置属性 -- 方法二 -- 外部级联
<!-- <bean id="emp1" class="com.hxp.bean.Emp">-->
<!-- <property name="ename" value="血小板"></property>-->
<!-- <property name="gender" value="女"></property>-->
<!-- <property name="dept" ref="dept1">-->
<!-- </property>-->
<!-- </bean>-->
<!-- <bean id="dept1" class="com.hxp.bean.Dept">-->
<!-- <property name="dname" value="血管部门"></property>-->
<!-- </bean>-->
</beans>
package com.hxp.bean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//2.创建Emp员工类
public class Emp {
private String ename;
private String gender;
private Dept dept;
public void setEname(String ename) {
this.ename = ename;
}
public void setGender(String gender) {
this.gender = gender;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public void test(){
System.out.println(ename + " " + gender + " " + dept);
}
//4.测试
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean3.xml");
Emp emp1 = context.getBean("emp1", Emp.class);
emp1.test();
}
}
xml注入集合类型的属性
- 注入数组类型属性
- 注入List集合类型属性
- 注入Map集合类型属性
- 注入Set集合类型属性
package com.hxp.spring5.collectiontype;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Stu {
private String[] courses;
private List<String> lists;
private Map<String,String> map;
private Set<String> sets;
public void setSets(Set<String> sets) {
this.sets = sets;
}
public void setCourses(String[] courses) {
this.courses = courses;
}
public void setLists(List<String> lists) {
this.lists = lists;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public String toString() {
return "Stu{" +
"courses=" + Arrays.toString(courses) +
", lists=" + lists +
", map=" + map +
", sets=" + sets +
'}';
}
}
<?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="stu1" class="com.hxp.spring5.collectiontype.Stu">
<!-- 设置数组-->
<property name="courses">
<array>
<value>数据结构与算法</value>
<value>计算机网络</value>
</array>
</property>
<!-- 设置list集合-->
<property name="lists">
<list>
<value>唐三</value>
<value>十号</value>
<value>萧炎</value>
</list>
</property>
<!-- 设置map集合-->
<property name="map">
<map>
<entry key="map1" value="Map1"></entry>
<entry key="map2" value="Map2"></entry>
</map>
</property>
<!-- 设置set集合-->
<property name="sets">
<set>
<value>MySql</value>
<value>Redis</value>
</set>
</property>
</bean>
</beans>
package com.hxp.spring5.collectiontype;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;
public class Course {
@Test
public void test(){
ApplicationContext context =
new ClassPathXmlApplicationContext("bean1.xml");
Stu stu1 = context.getBean("stu1", Stu.class);
System.out.println(stu1);
}
}
- 注意1:往集合里面注入对象,可以用外部bean的方式注入
//重新写一个属性 里面存对象
private List<Course> courseList;
public void setCourseList(List<Course> courseList) {
this.courseList = courseList;
}
public class Course {
private String courseName;
public void setCourseName(String courseName) {
this.courseName = courseName;
}
@Override
public String toString() {
return "Course{" +
"courseName='" + courseName + '\'' +
'}';
}
}
<!-- 配置xml文件-->
<bean id="stu1" class="com.hxp.spring5.collectiontype.Stu">
<property name="courseList">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</list>
</property>
</bean>
<bean id="course1" class="com.hxp.spring5.collectiontype.Course">
<property name="courseName" value="数据结构与算法"></property>
</bean>
<bean id="course2" class="com.hxp.spring5.collectiontype.Course">
<property name="courseName" value="计算机网络"></property>
</bean>
- 注意2:可以把集合里面的对象提取出来作为一个公共集合,让其他集合(对象)也可以使用
(1)在spring配置文件中引入,名称空间util
(2)使用util标签完成list集合注入提取
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!-- 配置util 第5行和第7行-->
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<util:list id="list1">
<value>易筋经</value>
<value>九阳神功</value>
<value>降龙十八掌</value>
</util:list>
<bean id="book1" class="com.hxp.spring5.collectiontype.Book">
<property name="bookList" ref="list1"></property>
</bean>
</beans>
(3)测试
package com.hxp.spring5.collectiontype;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class Book {
private List<String> bookList;
public void setBookList(List<String> bookList) {
this.bookList = bookList;
}
@Override
public String toString() {
return "Book{" +
"bookList=" + bookList +
'}';
}
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean2.xml");
Book book = context.getBean("book1", Book.class);
System.out.println(book);
}
}