1.Spring环境搭建
1.1创建工程
配置pom.xml
手动刷新,Maven下载jar包
1.2测试
1.3继承junit
2.spring详解
2.1控制反转IOC
传统new一个对象:
@Test
public void testMaster(){
Master master = new Master();
master.sayHellow();
}
Master对象master在testMaster方法创建,master对象控制权属于testMaster
spring中,没有new Master操作
通过Spring的AplicationContext获得其中:context.getBean("maste")
getBean,方法的参数值master,对应的是spring-context..xml中的bean的id:
<bean id="master"class="pojo.Master"></bean>
可见master)对象是由Springt创建的,其控制权属于Spingi而不属于使用者。
这种设计叫做“控制反转(Inversion of Control,英文缩写为loC)”。
2.2控制反转意义
IOC控制反转能够将对象之间的依赖关系转移到容器中进行管理,从而降低了对象之间的耦合性,使得程序更加灵活、可扩展和易于维护。
通过IOC容器管理对象之间的依赖关系,可以使得对象更加独立、可重用,从而提高了程序的可重用性。
补:ApplicationContext接口
ApplicationContext是Spring提供的一个高级的IloC容器,它除了能够提供IoC容器的基本功能外,还为用户提供了以下的附加服务。
从ApplicationContext接口的实现,我们看出其特点:
1.支持信息源,可以实现国际化。(实现MessageSource接口)
2.访问资源。(实现ResourcePatternResolver接口,这个后面要讲)
3.支持应用事件。(实现ApplicationEventPublisher接口)
示例:
IOC把对像生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的
对象都是实现于某种接口的),只要修改XML就可以了。
缺点:生成对象更复杂(使用反射编程,损耗了效率)
优点:提高维护性、灵活性
例:猫和狗都是宠物,猫是喵喵叫,狗是汪汪叫。我们可以通过三个类来描述宠物、猫、狗之间的关系。在pojo包下创建三个类,Pet,Dog,Cat
package pojo;
public abstruct class Pet{
//宠物都会叫,但叫不同
public abstruct void shout();
}
packag pojo;
class Cat extends Pet{
@Override
public void shout(){
System.out.println("喵喵");
}
}
class Dog extends Pet{
@Override
public void shout(){
System.out.println("汪汪");
}
}
如果在代码中需要修改业务需求就需要修改业务代码。
耦合性高
为了降低耦合,我们可以将Cat或Dog对象交给Spring管理,在spring-context.xml中添加一个bean:
<bean id="pet"class="pojo.Dog"></bean>
bean就是让Spring为我们创建一个对象,classe中指定了该对象的类型是pojo.Dog。如果不指定
bean的id,默认的Springi对bean命名为类名首字母小写。在一个项目中,bean的id必须是唯的。
测试方法:
@Test
public void testPet(){
ApplicationContext context
new classPathXmlApplicationContext("spring-config.xml);
Petpet (Pet)context.getBean("pet");
pet.shout()
}
3.多种方式注入
注解注入:(名称和位置)
@Autowired按类型注入Spring自己的注解,是自动注入,自动从spring的上下文找到合适的bean来注入
@Resource用来指定Bean名称注入,javaEE的,Spring也支特,建议使用整个,全球通用的
@Qualifier(和Autowired配合使用,指定bean的名称)
3.1属性注入(setter注入)
属性注入:通过属性的setter方法进行注入,需要注入的属性必须有setter方法且命名必修符合规范
例:属性名abc,注入方法setABC()
<property name="属性名" value="基本类型的属性值"/>
<property name="属性名" ref="对象的bean的id"/>
3.11注入基本类型
在Master类中添加name和age属性并添加getter/,setter方法。
public class Master{
private string name;
private Integer age;
//getter/setter暗
配置bean并注入age和name:
<bean id="master"class="pojo.Master">
<property name="name"value="张三"/>
<property name="age"value="20"/>
</bean>
通过property标签为对象注入属性。
<property name=“属性名”value=“属性值"/>
注入属性:
3.12注入对象类型
3.13集合类型
3.2构造方法注入
创建对象时注入属性
3.21按类型注入
// 实体类如下:
@Data
public class test {
private String name;
private Integer sex;
public test(String name,Integer sex){
this.name=name;
this.sex=sex;
}
}
// XML文件如下 test.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">
<!--set方式注入
id是注入bean中的名字
class 是全限定类名
constructor-arg 是按照构造方式注入
index 是按照成员变量在构造函数中的参数的第几个
name 表示成员变量名
type 表示类型
value 表示值
ref 表示引用 可引用另外一个注入到Spring的中的值
-->
<bean id="student1" class="com.example.spkie.model.test">
<constructor-arg index="0" name="name" value="构造方法注入"></constructor-arg>
<constructor-arg index="1" name="sex" value="50"></constructor-arg>
</bean>
</beans>
3.22按位置注入
3.23按名称注入--推荐
3.命名空间注入--类似属性注入
3.4工厂方法注入
3.5使用注解
注解注入:(名称和位置)
@Autowired按类型注入Spring自己的注解,是自动注入,自动从spring的上下文找到合适的bean来注入
@Resource用来指定Bean名称注入,javaEE的,Spring也支特,建议使用整个,全球通用的
@Qualifier(和Autowired配合使用,指定bean的名称)
4.Bean的生命周期和作用域
4.1生命周期
1.实例化Bean
2.设置属性
3.Bean初始化
3.1.执行各种通知
3.2.执行初始化的前置方法
3.3.执行构造方法
3.4.执行初始化的后置方法
4.使用Bean
5.销毁Bean
1.实例化Bean
实例化不是初始化,是为bean分配内存空间
2.设置属性(对象注入)
3.Bean初始化
执行各种通知:Awear通知
执行初始化前置方法
执行构造方法:·执行@PostConstruct;执行init-method)方法;
执行初始化后的后置方法
4.使用Bean
5.销毁Bean
销毁bean的方法:@PreDestroy和destroy-method方法
4.2作用域
六个作用域:
singleton(单例模式)
prototype(原型模式)
request(请求作用域)
session(会话作用域)
application(全局作用域)
websocket(HTTP WebSocketf作用域)
singleton(单例作用域)和application(全局作用域)
1.1.singleton(单例模式)
通常无状态(bean的状态不需要修改)下的bean就会使用该作用域,而且每一次注入的bean都是同一个bean;
1.2.prototype(原型模式)
原型模式其实就是相对于单例模式的多例模式,通常有状态的情况下使用该作用域,每一次注入的时候都会创建一个新的bean对象;
1.3.request(请求作用域)
这个是Spring MVC项目中独有的作用域,每一次http请求都会创建bean实例,类似于原型模式不过两种作用域发生在不同的项目里面;
1.4.session(会话作用域)
这个也是Spring MVC:项目中的,在一个http session中都会共享一个bean实例,来记录一个用户的登录信息;
1.5.application(全局作用域)
这个也是Spring MVC:项目中的,通常在一个http servlet Context中定义一个bean实例在Web应用的上下文中都是使用一个bean,这个作用域了解即可;
1.6.websocket(HTTP WebSocket作用域)
这个是Spring WebSocket项目里面的作用域,在一个http WebSocketf的生命周期中,会定义个bean,这个作用域了解即可;
设置作用域:
@Component
public class UserBeans {
@Bean(name = {"userinfo"})
public User getUser(){
User user = new User();
user.setId(1);
user.setName("小狗");
return user;
}
}
@Component
public class BeanScope1 {
@Autowired
private User userinfo;
public User getUser(){
User user = userinfo;
user.setName("张三");
return user;
}
}
@Component
public class BeanScope2 {
@Autowired
private User userinfo;
public User getUser(){
return userinfo;
}
}
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
BeanScope1 beanScope1 = context.getBean(BeanScope1.class);
User user1 = beanScope1.getUser();
System.out.println("BeanScope1:" + user1);
BeanScope2 beanScope2 = context.getBean(BeanScope2.class);
User user2 = beanScope2.getUser();
System.out.println("BeanScope2:" + user2);
}
}
设置值--直接设置
@Component
public class UserBeans {
@Bean(name = {"userinfo"})
@Scope("prototype")
public User getUser(){
User user = new User();
user.setId(1);
user.setName("小狗");
return user;
}
}
设置值--枚举设置
@Component
public class UserBeans {
@Bean(name = {"userinfo"})
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public User getUser(){
User user = new User();
user.setId(1);
user.setName("小狗");
return user;
}
}
5.AOP
5.1AOP概念
自动代理实现AOP
5.2前置增强
监控程序是否进入方法
Method method 反射回的方法(当前监控的方法)
Object objects 方法里的参数
ONullable Object o 当前方法所在类
增强类需声明成bean
测试方法:
测试类:
5.2后置增强
ONullable Object returnVal 方法返回值
Method method 反射回的方法(当前监控的方法)
Object objects 方法里的参数
ONullable Object o 当前方法所在类
5.3异常抛出增强
5.4环绕增强
5.5最终增强
最终增强:和环绕增强相比没有前置增强
5.6自定义增强
写入增强
普通的java类写入增强
注入bean,使用asepect标签,aop注入增强
5.7切入点excution表达式
5.8 aspectj实现aop
即注解方式实现AOP
定义aspect.service类
使用@PoinCut定义注解
开启增强: