Sping详解

 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定义注解

开启增强:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值