Spring

Spring是什么

Spring是一个轻量级的全栈式框架

轻量级指的是配置方便、占用资源小

全栈式指的是针对controller(springmvc),service(spring),dao(jdbctemplate)有不同的解决方案

Spring发展史

作者:Rod Johnson(Spring之父)

当前最新版:2017年9月发布了Spring 5.0最新通用版。

Spring的两大核心

IOC:全称Inverse of Control,控制反转的意思,表示把对象的创建交给框架

AOP:全称Aspect Oriented Programming,面向切面编程的意思,是对动态代理的再次封装

Spring的优势

1.可以借助IOC降低程序之间的耦合

2.可以借助AOP来实现方法的动态增强

3.支持声明式事物

4.方便集成其他框架,比如struts,hibernate,mybatis等

Spring开发简单原理

在这里插入图片描述

Spring 开发步骤

导入maven坐标

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.5.RELEASE</version>
    </dependency>
</dependencies>

编写UserDao接口和实现类
编写UserDao接口

public interface UserDao {
    void save();
}

编写UserDaoImpl实现类

public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("UserDao save method running...");
    }
}

创建Spring配置文件
根据下图步骤创建配置文件,配置文件名字最好叫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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

在配置文件中配置bean标签,将对象的创建交给Spring容器

在applicationContext.xml中添加

该标签的作用表示创建一个UserDaoImpl对象,对象名叫userDao

<?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">
    
    <bean id="userDao" class="cn.itcast.dao.impl.UserDaoImpl"></bean>
</beans>

使用Spring的API从容器中获取Bean实例

public class UserDaoImplTest {
    @Test
    public void save() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao)context.getBean("userDao");
        userDao.save();
    }
}

Spring配置文件详解

bean标签

功能

用于配置对象交由Spring 来创建。

注意事项
1.默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。所以建议所有类提供无参构造
2.id值不能重复

基本属性
属性描述
idBean实例在Spring容器中的唯一标识
classBean的全类名
scopesingleton: 单例。表示每次调用getBean(“”)方法获取到的都是同一个对象prototype:多例。表示每次调用getBean(“”)方法获取到的都是一个新的对象,每次获取到的都不一样
生命周期属性
属性描述
init-method创建bean的时候执行该属性指定的方法名
destroy-method销毁bean的时候执行该属性指定的方法名

在java代码中添加initMethod和destroyMethod


public class UserDaoImpl implements UserDao {
    public void initMethod(){
        System.out.println("对象初始化中");
    }
    public void destroyMethod(){
        System.out.println("对象被干掉了");
    }
    public void save() {
        System.out.println("UserDao save method running...");
    }
}

在配置信息中init-method,destroy-method

<?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">
    <bean id="userDao" class="cn.itcast.dao.impl.UserDaoImpl" init-method="initMethod" destroy-method="destroyMethod"></bean>
</beans>

测试类

public class UserDaoImplTest {

    @Test
    public void save() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao1 = (UserDao)context.getBean("userDao");
        context.close();

    }
}
执行结果

在这里插入图片描述

创建相关属性

创建方式描述
无参构造方法实例化总结:相当于 UserDao userDao = new UserDaoImpl(); 在这里插入图片描述

方工厂静态方法实例化 第一步:创建静态工厂

第二步:配置class属性指定工厂类,factory-method指定工厂方法

总结:相当于UserDao userDao = StaticFactory.getUserDao();
工厂实例方法实例化 第一步:创建工厂类

第二步:先将工厂类通过bean对象配置到XML中

第三步:配置userDao,通过factory-method指定具体工厂,通过factory-method指定工厂的具体方法

总结:相当于UserDao userDao = new DynamicFactory().getUserDao();
依赖注入(DI)
概念:通过框架给成员变量赋值,有2种方式,set方法和构造方法

通过set方法进行
解释:会调用userDao属性对应的setUserDao方法将id=”userDao”的bean注入给userDao属性

第一种 通过property标签

第二种 通过p命名空间

通过构造方法注入
解释:会调用UserServiceImpl类的的UserServiceImpl(UserDao userDao)方法将id=”userDao”的bean注入给userDao属性

普通数据类型注入
java代码

Java
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
private String name;
private Integer age;
}
通过spring的依赖注入给name和age赋值

Xml




集合数据类型
java代码

Java
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
private String name;
private Integer age;
private List hobbies;//爱好
private Map<String,String> kids; //孩子
private Properties wife;//妻子
private Set grandson;//孙子
}
通过spring的依赖注入给集合属性赋值

Xml





抢红包
收红包
放炮
洗脚

<property name="kids">
    <map>
        <entry key="大闺女" value="孙尚香"></entry>
        <entry key="二闺女" value="孙小香"></entry>
        <entry key="三儿子" value="孙悟空"></entry>
    </map>
</property>

<property name="wife">
    <props>
        <prop key="少奶奶">王晶</prop>
        <prop key="二姨太">张家晨</prop>
        <prop key="三姨太">张子祎</prop>
    </props>
</property>

<property name="grandson">
    <set>
        <value>孙富贵</value>
        <value>孙可爱</value>
        <value>孙漂亮</value>
        <value>孙美丽</value>
    </set>
</property>
测试代码

Java
public class UserTest {

@Test
public void testx(){
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    Object user = context.getBean("user");
    System.out.println(user);
}

}
运行结果

Code
User(name=孙凯, age=22, hobbies=[抢红包, 收红包, 放炮, 洗脚], kids={大闺女=孙尚香, 二闺女=孙小香, 三儿子=孙悟空}, wife={三姨太=张子祎, 少奶奶=王晶, 二姨太=张家晨}, grandson=[孙富贵, 孙可爱, 孙漂亮, 孙美丽])
注意事项
property容易混淆的2个属性名 value ,ref 都是给属性设置值的,value设置的是普通类型的值,ref是把当前容器中的其他bean赋值给属性

import标签
功能
引入其他xml配置文件

注意事项
该标签和bean是兄弟关系,不是嵌套关系

代码
Xml

<?xml version="1.0" encoding="UTF-8"?>


<import resource="applicationContext-user.xml"></import>
<import resource="applicationContext-product.xml"/>
Spring相关API ApplicationContext的实现类 ClassPathXmlApplicationContext

从类的根路径下加载配置文件,推荐使用

类的跟路径片面理解指的是src或者resources目录

Java
//从src目录下加载配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml”);
FileSystemXmlApplicationContext

他是从磁盘路径加载配置文件,配置文件可以放在磁盘的任意位置

Java
//从指定目录下加载配置文件
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(“D:\code\day15-1\s\src\main\resources\applicationContext.xml”);
AnnotationConfigApplicationContext

当使用注解方式配置容器对象时,需要使用此类创建Spring容器。它用来读取注解(后面介绍)

Java
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);
getBean()方法的使用
Java
package cn.itcast.dao.impl;

import cn.itcast.dao.UserDao;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import static org.junit.Assert.*;

public class UserDaoImplTest {

@Test
public void save() {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    //方式1:通过beanid查找对应的bean对象
    UserDao userDao1 = (UserDao)context.getBean("userDao");
    System.out.println(userDao1);
    //方式2:通过bean的类型查找相应的bean对象,此种方式的缺陷:UserDao接口的实现类只能有一个,如果有多个则不知道获取哪个,程序会报错
    UserDao userDao2 = context.getBean(UserDao.class);
    System.out.println(userDao2);
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值