spring基础

spring是一个开放源代码的设计层框架,解决的是业务逻辑层和其他层松耦合的问题,它将面向接口的编程思想贯穿整个应用.简单来说,spring是一个分层的javase/ee 一站式的轻量级开源框架

特点

方便解耦

通过spring提供的ioc容器,我们开源将对象之间的依赖关系由spring进行控制,避免硬编码所造成的国度程序耦合,有了spring用户不必再为单例模式类,属性文件解析等这些底层的需求编写代码,开源专注于更加上层的应用.

Aop编程的支持

通过spring提供的Aop(面向切面)编程,方便进行面向切面的编程.许多不容易用传统oop(面向对象)实现的功能开源通过Aop轻松应付

声明事物的支持

在spring中,我们可以从单调烦闷的事物管理代码中解脱出来,通过声明方式灵活地进行事物的管理,提高开发效率和质量

方便测试

可以用非容器依赖的编程方式进行几乎所有的测试工作,在spring里,测试不再是昂贵的操作,而是随手可做的事情,例如spring对junit4支持,可以通过注解方便的测试spring程序

方便集成各种优秀框架

spring不排除各种优秀的开源框架,相反,spring可以降低各种框架的使用难度,提供了对于各种优秀框架的直接支持

将低javaee api使用难度

spring对很多难用的javaeeapi如jdbc,javamail,远程调用等,提供了一个轻薄的封装,通过spring的简易封装,这些javaeeapi的使用难度大幅度降低

IOC与DI

IOC

IOC Inversion of Control控制反转,将对象的创建权交给spring

传统开发模式

业务和实现类过于紧密,底层业务要修改源代码

无参实例化

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"
       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/mvc
    ">
    <bean id="userDao" class="com.itlike.demo1.User"></bean>

</beans>

测试

package com.itlike.demo1;

import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        //加载配置文件
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        //
        User user=(User)applicationContext.getBean("userDao");
        user.destory();
    }
}

创建的时机

老版本Beanfactory当调用getBean时候才会加载

新版本ApplicationContext,当加载配置文件的时候就会创建实例对象

实现类的俩种加载方法

可以指定初始化和类销毁的时候执行的方法

init-method:初始化调用的方法,初始化调用对全局有效

destory-method:销毁的时候调用的方法

  • 可以用applicationContext.close()来销毁工厂,如果是多例的,对象不会销毁

scope="" 参数:

  • singleton:默认的,单例模式,获取的每个对象
  • prototype:每一次都创建一个新的对象
  • request 应用在web项目中,spring创建这个类之后,将类存入到request中
  • session应用在web项目中,spring创建这个类之后,将类存入到session中
  • globalsession应用在web项目中,必须在porlet(基于java的web组件,子域名)环境下使用.如果没有这种环境,就相对于session
<bean id="userInt" class="com.itlike.demo1.User" init-method="init"  destory-method="destory">

</bean>

静态工厂实例化

factory-method="指定静态的返回对象的方法区创建对象"

factory-bean="user"指定另一个类

User类

package com.itlike.demo1;

public class User{
    public static User createUser(){
        //必须是静态方法,必须返回一个值,作为实例化对象
        System.out.println("创建User");
        return new User();
    }
    //
    public void init(){
        System.out.println("user创建");
    }
    public void destory(){
        System.out.println("user销毁");
    }
}

xml

<bean id="userDao" class="cn.nasuiyile.test.User" init-method="init" destory-method="destory">
    <project name="name" value="123123"/>
</bean>

实例工厂实例化(调用上面的实例化)

<bean id="userInt" class="com.itlike.demo1.User" init-method="init" factory-method="createUser">
</bean>
<bean id="userDao" class="com.itlike.demo1.User" factory-bean="userInt"></bean>

分模块

引入其他模块

一次性引入多个配置文件

ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml","app2.xml");

最佳

<import resource="classpath:application-mybatis.xml"/>

属性注入

DI

依赖注入,前提必须有ioc的环境,依赖注入:给spring管理类当中各依赖的管理属性,通过配置文件进行复制的过程

<!--为自己起的名,可以加载文件之后getBean传入id来获取类实例-->
<bean id="userDao" class="cn.nasuiyile.test.UserDaoMysql">
    <!--name:要注入的属性名称,value:注入值,属性:要提供set方法-->
    <project name="name" value="123123"/>
</bean>

构造犯法注入

<bean id="gz" class="com.itlike.demo1.User">
    <constructor-arg name="id" value="1"/>
</bean>

注入引用数据类型

,也需要提供get与set方法

user类

package com.itlike.demo1;

public class User{

    Dog dog;

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public Dog getDog() {
        return dog;
    }
}

dog类

package com.itlike.demo1;

public class Dog {
    String name ;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

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"
       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/mvc
    ">
    <!--<bean id="userInt" class="com.itlike.demo1.User" init-method="init" factory-method="createUser">-->

    <!--</bean>-->
    <!--<bean id="userDao" class="com.itlike.demo1.User" factory-bean="userInt"></bean>-->

    <bean id="dog" class="com.itlike.demo1.Dog">
        <property name="name" value="旺财"/>
    </bean>

    <bean id="gz" class="com.itlike.demo1.User">
        <property name="dog" ref="dog" />
    </bean>

</beans>

main

package com.itlike.demo1;

import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        //加载配置文件
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        User user=(User)applicationContext.getBean("gz");
        System.out.println(user.dog.name);//旺财
    }
}

p名称空间

在xml上面加上

xmlns:p="http://www.springframework.org/schema/p"

,可以用p:属性值代替<property>,用法为p:属性名="value值"

一般不推荐使用

<bean id="dog" class="com.itlike.demo1.Dog" p:name="旺财">
</bean>
这俩个作用相同
<bean id="dog" class="com.itlike.demo1.Dog" >
   <property name="name" value="旺财"/>
</bean>

spring中还可以写el表达式

集合类型注入

dog类

package com.itlike.demo1;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class Dog {

    public String attr[];

    public List mylist;

    public Set mySet;

    public Map myMap;

    public Map getMyMap() {
        return myMap;
    }

    public void setMyMap(Map myMap) {
        this.myMap = myMap;
    }

    public String[] getAttr() {
        return attr;
    }

    public void setAttr(String[] attr) {
        this.attr = attr;
    }

    public List getMylist() {
        return mylist;
    }

    public void setMylist(List mylist) {
        this.mylist = mylist;
    }

    public Set getMySet() {
        return mySet;
    }

    public void setMySet(Set mySet) {
        this.mySet = mySet;
    }
}

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"
       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/mvc
    ">

    <bean id="dog" class="com.itlike.demo1.Dog">
        <property name="attr">
            <list>
                <value>123</value>
                <value>123</value>
                <value>123</value>
            </list>
        </property>
        <property name="mylist">
            <list>
                <value>123</value>
                <value>123</value>
                <value>123</value>
            </list>
        </property>
        <property name="mySet">
            <set>
                <value>123</value>
                <value>222</value>
                <value>212</value>
            </set>
        </property>
        <property name="myMap">
            <map>
                <entry key="key1" value="23"></entry>
                <entry key="key2" value="2123"></entry>
                <entry key="key3" value="23"></entry>
            </map>
        </property>
    </bean>


</beans>

main

package com.itlike.demo1;

import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        //加载配置文件
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        Dog dog=(Dog)applicationContext.getBean("dog");
        System.out.println(dog.attr[0]);
        System.out.println(dog.mylist);
        System.out.println(dog.mySet);
        System.out.println(dog.myMap);
    }
}

spring注解开发

在spring4之后想要使用注解形式需要引入aop的包,在配置文件当中还要引入一个context约束

@component("名")相当于在配置文件中配置<bean id="" class="">

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"
       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/mvc
    ">
    <!--指定扫描的包-->
   <context:component-scan base-package="com.itlike"/>


</beans>

user类

package com.itlike.demo1;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("user")
public class User{
    //如果提供set方法在set方法上面@value("值")
    //如果不提供set方法,就直接@value
    @Value("默认值")
    public String name;
}

main

package com.itlike.demo1;

import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        //加载配置文件
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        User user=(User)applicationContext.getBean("user");
        System.out.println(user.name);
    }
}

三个衍生注解

为了更好的分层,spring可以使用跟其它三个注解,功能类似目前使用哪一个功能都一样.后面可能会添加一些自己的属性

@controller web层

@Service service层

@Repository dao层

属性注入

@Value 设置普通属性值

@Autowired 设置对象类型的属性值,直接使用这种方式,是按照类型完全属性注入,不需要再主街上使用id名称,习惯是按照名称完成属性注入.根据类名,自动找到spring管理的对应的类,进行注入.

@Qualifier("dog") 根据名称进行注入

@Resource(name="dog")//这样写等于以上俩种写法

@PostConstruct 初始化方法

@PerDestory 销毁方法

@Scope作用范围 类似xml配置中的scope属性

dog类

package com.itlike.demo1;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("dog")
public class Dog {

    @Value("旺财")
    public String name;

    public Dog dog;

}

user类

package com.itlike.demo1;

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("user")
public class User{
    @Autowired//根据类型进行注入
    @Qualifier("dog")//根据名称注入
    Dog dog;
    @Value("默认值")
    public String name;
}

main

package com.itlike.demo1;

import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        //加载配置文件
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        User user=(User)applicationContext.getBean("user");
        System.out.println(user.dog.name);
    }
}

xml与注解整合开发

xml与注解比较:xml可以使用于任何常见,结构清晰,维护方便,注解不是自己提供的类使用不了,开发方便

<Context:anntation-config/>

使用该注解就可以直接在类中

xml管理bean,注解完成属性注入

使用过程中,可以不用扫描,扫描是为了防止类上的注解在没有扫描的情况下,使用@Resource @value @Autowired @Qulifer

Last modification:March 25, 2020
如果觉得我的文章对你有用,请随意赞赏