Spring(5%)

Spring

Spring是什么?

Spring是一个轻量级的控制反转(IOC/DI)和面向切面编程(AOP)的对象容器框架。

就是一个管理对象的容器。

Spring优点

  • 方便解耦、简化开发。
  • AOP编程的支持。
  • 声明式事务的支持。
  • 方便程序的测试。
  • 方便集成各种优秀的框架。

IOC(Inversion of Control,控制反转)

将对象的创建和初始化过程交给第三方(spring)来完成,是一种思想。

DI(Dependency Injection,依赖注入)

具体实现IOC的一种方式。

AOP(Aspect Oriented Programing,面向切面编程)

通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。


创建一个Spring项目

Spring Tool Suite4 + Maven

  1. 创建一个maven项目,之后在pom.xml里添加依赖
<dependencies>
	<dependency>
	    <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.8.RELEASE</version>
	</dependency>
</dependencies>
  1. src/main/resources下创建xml文件为“applicationContext.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:context="http://www.springframework.org/schema/context"
            xmlns:aop="http://www.springframework.org/schema/aop"
            xmlns:tx="http://www.springframework.org/schema/tx"
            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
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx.xsd">
    </beans>
    

使用Spring来管理对象

  1. 首先,需要创建一个类,例如

    package springStudy01;
    
    public class Person {
        
    }
    
  2. 然后在‘’applicationContext.xml‘’里添加一个bean

    <bean id="P" class="springStudy01.Person"></bean>
    

    bean的id不可以和其他bean重复,class是类的路径。

  3. 现在可以获取到这个对象了

    package springStudy01;
    
    public class Main {
        public static void main(string [] args) {
            
            ClassPathApplicationContext ctx = ClassPathApplicationContext("application.xml"); // 获取到application.xml
            
            Person p = (Person)ctx.getBean("P"); // 根据bean的id去查找,因为返回的是Object类型所以需要强制转换。
            // Person p = ctx.getBean("P",Person.class);  告知对象类型避免强制转换。
        	System.out.println(p);
        }
        
    }
    
  4. 运行结果如下

    [外链图片转存失败(img-FzNv64Cn-1562766839377)(http://pu5xcikhb.bkt.clouddn.com/blog/20190705/qC70T6Qi1tQe.png?imageslim)]

  5. 但此时我们知道就算获取到了Person对象,但是里面什么也没有。通常情况下初始化对象时需要向里面传递一些参数,那么这些参数该怎么传递呢?

  6. 先给Person类添加一些属性和一个构造方法

    package springStudy01;
        
    public class Person {
        private String name;
        private int age;
        private Dog dog;
        
        public Person(String name, int age, Dog dog) {
            this.name = name;
            this.age = age;
            this.dog = dog;
        }
        
       		public String getName() {
    			return name;
    		}
    
    		public void setName(String name) {
    			this.name = name;
    		}
    
    		public int getAge() {
    			return age;
    		}
    
    		public void setAge(int age) {
    			this.age = age;
    		}
    
    		public Dog getDog() {
    			return dog;
    		}
    
    		public void setDog(Dog dog) {
    			this.dog = dog;
    		}
    }
    

    再新创建一个类

    package springStudy01;
    
    public class Dog {
        
    }
    
  7. 现在只需要在”applicationContext.xml”里添加

    <bean id="P" class="springStudy01.Person">
    	<constructor-arg name="name" value="Doge"/>
        <constructor-arg name="age" value="17"/>
        <constructor-arg name="dog" ref="D"/>
    </bean>
    
    <bean id="D" class="springStudy01.Dog"/>
    

    constructor-arg 构造参数,听名字大概也能推测出来他调用了Person类对应的构造方法。

    name里写的是属性名字

    value里写的是具体的内容

    ref里写的是引用,这里应该写对应类的bean的id

    实际上constructor-arg还有两个属性名为 index和type

    index按照对应构造方法传递参数的顺序来区分具体的属性

    type则是传递属性的类型,通常会自动装配所以不用写。

  8. 把属性打印出来

mark

完成。

bean作用域

spring为bean提供了6种作用域,其中四种只有在web-aware 的 applicationContext中才有用。

  • singleton scope 单例作用域

    每一个bean只生产一个实例。

  • prototype scope 原型作用域

    该bean每次被注入,或者每次调用getBean()方法时,都会产生一个新的实例。

  • websocket scope

    在一个WebSocket生命周期中定义一个Bean。

  • request scope

    在一个HTTP请求中创建一个Bean的实例。

  • session scope

    在一个HTTP会话的生命周期中创建一个Bean的实例。

  • application scope

    在一个ServletContext的生命周期中创建一个Bean的实例。

MVC

mark


循环引用

如果有三个类,A里有B的引用,B里有C的引用,C里有A的引用。

  • 如果三个类都是singleton的话会正常运行
  • 如果都是prototype的话就会报错
  • 其中有一个是singleton的话也会正常运行

主要原因是单例情况下会直接实例化类,而原型情况下则会检查引用,有引用需要实例化的时候会先去实例化引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值