Spring入门
1:sprin的作用:解耦
使用Spring框架,将对象创建权交给Spring容器,由框架自行创建对象 底层是:工厂模式+配置文件+反射
2:Spring核心 IOC 和 AOP
IOC( inversion of Control ) :控制反转就是解决主业务的耦合,配置文件+反射+工厂
AOP:面向切面编程,将交叉业务作为切面(交叉业务)织入到主业务中
解决主业务逻辑和交叉业务逻辑耦合
Filter就是AOP
Filter做登录判断(切面,可复用的交叉业务)
<url-pattern>/order/*</url-pattern>(主业务)
<url-pattern>/cart/*</url-pattern>(主业务)
Spring
广义:Spring全家桶:Spring+SpringBoot+SpringCloud
狭义:Spring Framework
IOC的典型应用
让容器创建对象,初始化属性值
应用:
管理三层中的核心类Controller,Service,Dao
框架整合,使用Spring框架管理其他框架的核心类, SSH ,SSM
3;项目中的业务功能可以分成两类
1 主业务逻辑
复用度低:(例如 :转账,存钱,取钱,借书,还书,入住,结账)
2 交叉业务逻辑(系统级服务)
可以复用:(例如 :记录日志,事务控制,权限控制)
4 Spring文件解析
1 :Spring文件
2: 目录解析
3 :4个主要的核心包
5:入门准备
把jar包放进程序中
log4j和logging的关系:
logging:日志门面,接口
log4j: 一种日志实现
配置文件:建议放在src类路径根目录下,名字可以任意,官方建议applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这些所有可以在帮助文档中通过搜索 beans.xsd 复制而得 -->
<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">
<!--id:以供后面调用 class:接口实现类的全限定名 -->
<!-- <bean id="qwe" class="com.woniu.entity.user.Userlimp"></bean>
<bean id="ewq" class="com.woniu.entity.goods.Goodsimp"></bean> -->
</beans>
6 Api的调用
@Test
public void test2() {
//使用Spring解耦
//ICO:控制反转,对象创建权的转移,以前是由程序员new
String path="myApplicationContext.xml";//获取路径
ApplicationContext ac=new ClassPathXmlApplicationContext(path);
//通过Spring 获取对象 getBean("配置文件中的id")
Goods us = (Goods) ac.getBean("ewq");//Goods:接口
us.ter();//us.ter:接口中的方法
}
1 :ApplicationContext和BeanFactroy的区别
ApplicationContext:容器启动时,创建所有bean 启动时会慢一点(推荐使用,开始慢,后面就一样)
BeanFactroy :容器启动时,不会立即创建bean,只有在调用getBean时,才创建bean (现在一般都不推荐使用 用户体验度不怎么好)
2 :bean的装配:让容器来创建对象
bean的装配方式分为3种:
底层使用无参构造器, 如果写了带参构造器就一定要加无参构造器
1 :默认装配方式
2 :基于annotion(注解)的装配
3 :基于XML的装配
3 :动态工厂bean
1 主配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这些所有可以在帮助文档中通过搜索 beans.xsd 复制而得 -->
<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">
<!--id:以供后面调用 factory-bean :下方的id factory-method :工厂中的方法-->
<bean id="mybean" factory-bean="beanFactory" factory-method="getGoods"></bean>
<!--id:上面调用 class:工厂的全限定名 -->
<bean id="beanFactory" class="com.woniu.entity.beanfactory.BeanFactory"></bean>
</beans>
2 工厂
package com.woniu.entity.beanfactory;
public class BeanFactory {
//工厂 Goods:接口 Goodsimp:Goods的实现类
public Goods getGoods() {
return new Goodsimp();
}
}
3 测试类(仅供测试代码)
@Test
public void test3() {
String path="myApplicationContext.xml";//获取路径
ApplicationContext ac=new ClassPathXmlApplicationContext(path);
//通过Spring 获取对象 getBean("配置文件中的id")
Goodsimp good=(Goodsimp) ac.getBean("mybean");//Goodsimp :Goods接口的实现类
good.ter();//us.ter:接口中的方法
}
4 静态工厂
1主配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这些所有可以在帮助文档中通过搜索 beans.xsd 复制而得 -->
<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">
<!--id :以供后面调用 class :工厂的全限定名 factory-method : 工厂中的方法-->
<bean id="mybean" class="com.woniu.entity.beanfactory.BeanFactory" factory- method="getGoods"></bean>
</beans>
2 工厂
package com.woniu.entity.beanfactory;
public class BeanFactory {
//工厂 Goods:接口 Goodsimp:Goods的实现类
public static Goods getGoods() {
return new Goodsimp();
}
}
3 测试类
@Test
public void test4() {
String path="myApplicationContext.xml";//获取路径
ApplicationContext ac=new ClassPathXmlApplicationContext(path);
//通过Spring 获取对象 getBean("配置文件中的id")
Goodsimp good=(Goodsimp) ac.getBean("mybean");//Goodsimp :Goods接口的实现类
good.ter();//us.ter:接口中的方法
}
5 bean的作用域及生命周期
1 bean的作用域:
1 singleton(默认为单例)
2 prototype (原型)
3 web中可以使用 request session globasession
<!--scope: 设置作用域 -->
<bean id="qwe" class="com.woniu.entity.user.Userlimp" scope=""></bean>
2 bean的生命周期 :分为11个阶段
需要了解的:
构造器 属性赋值 init-method(初始化) 执行业务方法 destroy-method(销毁)
6 依赖注入DI
1 IOC(Inversion of Controll):控制反转,是一种思想,有不同的实现方式,常见的有两种
1 DL(dependence looup):依赖查找,类似于目录查找 JNDL java命名查找
2 DI(dependence injection):依赖注入,对象由容器创建,对象的属性值也在配置文件中配置
创建对象+对象属性赋值
2 DI分为两种
1 设值注入(底层使用无参构造+setXxx()方法)
1 主配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这些所有可以在帮助文档中通过搜索 beans.xsd 复制而得 -->
<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="mystu" class="com.woniu.entity.stu.Stu">
<!--property name: 实体类的属性 value:值-->
<property name="sid" value="1"/>
<property name="sname" value="张三"/>
<!-- ref: 简单引用数据类型 引用下方clas -->
<property name="classe" ref="clas"/>
</bean>
<bean id="clas" class="com.woniu.entity.stu.Classe">
<property name="cid" value="2"/>
<property name="cname" value="1教"/>
</bean>
</beans>
2 测试类
@Test
public void test5() {
String path="myApplicationContext.xml";//获取路径
ApplicationContext ac=new ClassPathXmlApplicationContext(path);
//通过Spring 获取对象 getBean("配置文件中的id")
Stu stu= (Stu) ac.getBean("mystu");
System.out.println(stu);
}
2 构造注入(底层使用有参构造)
1 主配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这些所有可以在帮助文档中通过搜索 beans.xsd 复制而得 -->
<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="mystu" class="com.woniu.entity.stu.Stu">
<constructor-arg name="sid" value="1"/>
<constructor-arg name="sname" value="李四"/>
<constructor-arg name="classe" ref="clas"/>
</bean>
<bean id="clas" class="com.woniu.entity.stu.Classe">
<constructor-arg name="cid" value="2"/>
<constructor-arg name="cname" value="2教"/>
</bean>
</beans>
2 测试代码
@Test
public void test5() {
String path="myApplicationContext.xml";//获取路径
ApplicationContext ac=new ClassPathXmlApplicationContext(path);
//通过Spring 获取对象 getBean("配置文件中的id")
Stu stu= (Stu) ac.getBean("mystu");
System.out.println(stu);
}
7 常见的属性赋值方式
话不多说 直接上源码
实体类:
package com.woniu.entity.zhujie;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class Fuzhi {
private String[] strs;//数组
private School[] scs;//对象数组
private List<String> listStrs;//list集合
private List<School> listSc;//
private Set<String> setStrs;//set集合
private Set<School> setSc;
private Map<String, String> mapStrs;//map集合
private Map<String,School> mapSc;
private Properties pro;//配置文件
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这些所有可以在帮助文档中通过搜索 beans.xsd 复制而得 -->
<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="shux" class="com.woniu.entity.zhujie.Fuzhi">
<!-- 对象是数组 : String[] strs -->
<property name="strs">
<array>
<value>aaaa</value>
<value>啊啊啊啊</value>
</array>
</property>
<!-- 对象是对象数组: School[] scs -->
<property name="scs">
<array>
<ref bean="school01"/>
<ref bean="school02"/>
</array>
</property>
<!-- 对象是List<String>集合: List<String> listStrs -->
<property name="listStrs">
<list>
<value>qwe</value>
<value>ewq</value>
</list>
</property>
<!--对象是List<实体类>集合: List<School> listSc -->
<property name="listSc">
<list>
<ref bean="school01"/>
<ref bean="school02"/>
</list>
</property>
<!--对象是set<String>集合: Set<String> setStrs -->
<property name="setStrs">
<set>
<value>asd</value>
<value>zxc</value>
</set>
</property>
<!-- 对象是set<实体类>集合:Set<School> setSc -->
<property name="setSc">
<set>
<ref bean="school01"/>
<ref bean="school02"/>
</set>
</property>
<!--对象是map<String, String>集合: Map<String, String> mapStrs -->
<property name="mapStrs">
<map>
<entry key="1" value="qwe"/>
<entry key="2" value="ewq"/>
</map>
</property>
<!-- 对象是map<String,实体类>集合 :Map<String,School> mapSc -->
<property name="mapSc">
<map>
<entry key="1" value-ref="school01"/>
<entry key="2" value-ref="school02"/>
</map>
</property>
<!-- 对象是Properties(配置文件): Properties pro-->
<property name="pro">
<props>
<prop key="1">qweqwe</prop>
<prop key="2">qweqwe</prop>
</props>
</property>
</bean>
<bean id="school01" class="com.woniu.entity.zhujie.School">
<property name="sid" value="1"/>
<property name="sname" value="北大"/>
</bean>
<bean id="school02" class="com.woniu.entity.zhujie.School">
<property name="sid" value="2"/>
<property name="sname" value="川大"/>
</bean>
</beans>
8 域属性自动注入
主配置文件代码:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这些所有可以在帮助文档中通过搜索 beans.xsd 复制而得 -->
<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">
<!-- 自动注入 之:byType(类型自动查找:实体类中的属性 对应bean中的class)-->
<bean id="mystu" class="com.woniu.entity.zhidong.Stu" autowire="byType">
<property name="sid" value="1"/>
<property name="sname" value="张三"/>
</bean>
<bean class="com.woniu.entity.zhidong.School" >
<property name="sid" value="1"/>
<property name="sname" value="社大"/>
</bean>
<!-- 自动注入 之:byName(类型自动查找:实体类中的属性 对应bean中的class)-->
<bean id="mystu1" class="com.woniu.entity.zhidong.Stu" autowire="byName">
<property name="sid" value="2"/>
<property name="sname" value="李四"/>
</bean>
<bean id="school" class="com.woniu.entity.zhidong.School" >
<property name="sid" value="2"/>
<property name="sname" value="社大"/>
</bean>
</beans>
测试代码:
//自动注入之byType
@Test
public void test7() {
String path="com/woniu/entity/zhidong/myApplicationContext.xml";
ClassPathXmlApplicationContext cl = new ClassPathXmlApplicationContext(path);
Stu st = (Stu) cl.getBean("mystu");
System.out.println(st);
}
//自动注入之byName
@Test
public void test8() {
String path="com/woniu/entity/zhidong/myApplicationContext.xml";
ClassPathXmlApplicationContext cl = new ClassPathXmlApplicationContext(path);
Stu st = (Stu) cl.getBean("mystu1");
System.out.println(st);
}
9 注解配置
@Component 通用类
@Respository Dao MyBatis没有接口的实现类,用不到;Hibernate要用
@Service Service
@Controller Controller
主配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这些所有可以在帮助文档中通过搜索 beans.xsd 复制而得
使用注解 需要导入
xmlns:context="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 注解配置 -->
<!--context:component-scan: 组件扫描器,告诉系统到哪些包下去扫描注解
com.woniu.entity.zhu :扫描当前包及子包
com.woniu.entity.zhu.* :扫描当前包的子包
-->
<context:component-scan base-package="com.woniu.entity.zhu"/>
</beans>
实体类中:
JDK1.6版本之前:
byTYpe:
package com.woniu.entity.zhu;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Stu {
@Value("1")
private int sid;
@Value("王五")
private String sname;
@Autowired
private School School;
public Stu(int sid, String sname, com.woniu.entity.zhu.School school) {
super();
this.sid = sid;
byName :
package com.woniu.entity.zhu;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Stu {
@Value("1")
private int sid;
@Value("王五")
private String sname;
@Autowired
@Qualifier("school")
private School School;
public Stu(int sid, String sname, com.woniu.entity.zhu.School school) {
super();
this.sid = sid;
this.sname = sname;
JDL1.6版本之后:
byType :
package com.woniu.entity.zhu;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Stu {
@Value("1")
private int sid;
@Value("王五")
private String sname;
@Resource
private School School;
public Stu(int sid, String sname, com.woniu.entity.zhu.School school) {
super();
this.sid = sid;
this.sname = sname;
School = school;
}
byName :
package com.woniu.entity.zhu;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Stu {
@Value("1")
private int sid;
@Value("王五")
private String sname;
@Resource(name="school")
private School School;
public Stu(int sid, String sname, com.woniu.entity.zhu.School school) {
super();
this.sid = sid;
this.sname = sname;
School = school;
}