Spring入门

Spring01入门

Spring是什么

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

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

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

Spring发展史

作者:Rod Johnson(Spring之父)
当前最新版:2017年9月发布了Spring 5.0最新通用版。

Spring的两大核心

IOC:全称Inverse of Control,控制反转的意思,Spring反向控制应用程序所需要使用的外部资源(把对象的创建交给框架)
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="实现类的全限定名(包名+类名)"></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();
方工厂静态方法实例化第一步:创建静态工厂在这里插入图片描述第二步:先将工厂类通过bean对象配置到XML中在这里插入图片描述第三步:配置userDao,通过factory-method指定具体工厂,通过factory-method指定工厂的具体方法在这里插入图片描述
依赖注入(DI)

概念:通过框架给成员变量赋值,有2种方式,set方法和构造方法

通过set方法进行

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

第一种 通过property标签

在这里插入图片描述

第二种 通过p命名空间

在这里插入图片描述
通过构造方法注入
解释:会调用UserServiceImpl类的的UserServiceImpl(UserDao userDao)方法将id=”userDao”的bean注入给userDao属性

在这里插入图片描述

普通数据类型注入

@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
    private String name;
    private Integer age;
}

通过spring的依赖注入给name和age赋值

<bean id="user" class="cn.itcast.domain.User">
	<property name="name" value="孙凯"></property>
	<property name="age" value="22"></property>
</bean>

集合数据类型

@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
    private String name;
    private Integer age;
    private List<String> hobbies;//爱好
    private Map<String,String> kids; //孩子
    private Properties wife;//妻子
    private Set<String> grandson;//孙子
}

通过spring的依赖注入给集合属性赋值

<bean id="user" class="cn.itcast.domain.User">
    <property name="name" value="孙凯"></property>
    <property name="age" value="22"></property>
    <property name="hobbies">
        <list>
            <value>抢红包</value>
            <value>收红包</value>
            <value>放炮</value>
            <value>洗脚</value>
        </list>
    </property>
    <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>
</bean>

测试代码

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

运行结果

User(name=孙凯, age=22, hobbies=[抢红包, 收红包, 放炮, 洗脚], kids={大闺女=孙尚香, 二闺女=孙小香, 三儿子=孙悟空}, wife={三姨太=张子祎, 少奶奶=王晶, 二姨太=张家晨}, grandson=[孙富贵, 孙可爱, 孙漂亮, 孙美丽])

注意事项

property容易混淆的2个属性名 value ,ref 都是给属性设置值的,value设置的是普通类型的值,ref是把当前容器中的其他bean赋值给属性

import标签

功能

引入其他xml配置文件

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

<?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>
    
    <import resource="applicationContext-user.xml"></import>
    <import resource="applicationContext-product.xml"/>
</beans>

Spring相关API

ApplicationContext的实现类

ClassPathXmlApplicationContext

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

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

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

FileSystemXmlApplicationContext

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

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

AnnotationConfigApplicationContext

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

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);

getBean()方法的使用

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值