Spring01入门
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开发简单原理
(https://gitee.com/haoyongliang/resources/raw/master/images/spring/Spring01入门和配置信息/1.png)
Spring 开发步骤
导入maven坐标
1 2 3 4 5 6 7
| <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.5.RELEASE</version> </dependency> </dependencies>
|
编写UserDao接口和实现类
编写UserDao接口
1 2 3
| public interface UserDao { void save(); }
|
编写UserDaoImpl实现类
1 2 3 4 5
| public class UserDaoImpl implements UserDao { public void save() { System.out.println("UserDao save method running..."); } }
|
创建Spring配置文件
根据下图步骤创建配置文件,配置文件名字最好叫applicationContext.xml
(https://gitee.com/haoyongliang/resources/raw/master/images/spring/Spring01入门和配置信息/2.png)
配置文件内容
1 2 3 4 5 6
| <?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
1 2 3 4 5 6 7 8
| <?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实例
1 2 3 4 5 6 7 8
| 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值不能重复
基本属性
属性 | 描述 |
---|
id | Bean实例在Spring容器中的唯一标识 |
class | Bean的全类名 |
scope | singleton: 单例。表示每次调用getBean(“”)方法获取到的都是同一个对象。 prototype:多例。表示每次调用getBean(“”)方法获取到的都是一个新的对象,每次获取到的都不一样 |
生命周期属性
属性 | 描述 |
---|
init-method | 创建bean的时候执行该属性指定的方法名 |
destroy-method | 销毁bean的时候执行该属性指定的方法名 |
在java代码中添加initMethod和destroyMethod
1 2 3 4 5 6 7 8 9 10 11
| 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
1 2 3 4 5 6
| <?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>
|
测试类
1 2 3 4 5 6 7 8 9 10
| public class UserDaoImplTest {
@Test public void save() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao1 = (UserDao)context.getBean("userDao"); context.close();
} }
|
执行结果
(https://gitee.com/haoyongliang/resources/raw/master/images/spring/Spring01入门和配置信息/29.jpg)
创建相关属性
创建方式 | 描述 |
---|
无参构造方法实例化 | |
方工厂静态方法实例化 | 第一步:创建静态工厂 |
工厂实例方法实例化 | 第一步:创建工厂类 |
依赖注入(DI)
概念:通过框架给成员变量赋值,有2种方式,set方法和构造方法
通过set方法进行
解释:会调用userDao属性对应的setUserDao方法将id=”userDao”的bean注入给userDao属性
第一种 通过property标签
第二种 通过p命名空间
通过构造方法注入
解释:会调用UserServiceImpl类的的UserServiceImpl(UserDao userDao)方法将id=”userDao”的bean注入给userDao属性
普通数据类型注入
java代码
1 2 3 4 5 6 7
| @NoArgsConstructor @AllArgsConstructor @Data public class User { private String name; private Integer age; }
|
通过spring的依赖注入给name和age赋值
1 2 3 4
| <bean id="user" class="cn.itcast.domain.User"> <property name="name" value="孙凯"></property> <property name="age" value="22"></property> </bean>
|
集合数据类型
java代码
1 2 3 4 5 6 7 8 9 10 11 12
| @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; private int[] numbers; }
|
通过spring的依赖注入给集合属性赋值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| <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> <property name="numbers"> <array> <value>123456</value> <value>66666</value> </array> </property>
</bean>
|
测试代码
1 2 3 4 5 6 7 8 9
| public class UserTest {
@Test public void testx(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Object user = context.getBean("user"); System.out.println(user); } }
|
运行结果
1
| User(name=孙凯, age=22, hobbies=[抢红包, 收红包, 放炮, 洗脚], kids={大闺女=孙尚香, 二闺女=孙小香, 三儿子=孙悟空}, wife={三姨太=张子祎, 少奶奶=王晶, 二姨太=张家晨}, grandson=[孙富贵, 孙可爱, 孙漂亮, 孙美丽])
|
注意事项
property容易混淆的2个属性名 value ,ref 都是给属性设置值的,value设置的是普通类型的值,ref是把当前容器中的其他bean赋值给属性
import标签
功能
引入其他xml配置文件
注意事项
该标签和bean是兄弟关系,不是嵌套关系
代码
1 2 3 4 5 6 7 8 9
| <?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目录
1 2
| ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
|
FileSystemXmlApplicationContext
他是从磁盘路径加载配置文件,配置文件可以放在磁盘的任意位置
1 2
| FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("D:\\code\\day15-1\\s\\src\\main\\resources\\applicationContext.xml");
|
AnnotationConfigApplicationContext
当使用注解方式配置容器对象时,需要使用此类创建Spring容器。它用来读取注解(后面介绍)
1
| ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);
|
getBean()方法的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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"); UserDao userDao1 = (UserDao)context.getBean("userDao"); System.out.println(userDao1); UserDao userDao2 = context.getBean(UserDao.class); System.out.println(userDao2); } }
|
Spring整合mybatis
点击查看
面试题总结
什么是IOC
IOC是控制反转,就是将对象的创建交由框架管理
什么是DI
DI是依赖注入,就是通过框架给成员变量赋值,框架中称为注入值。注入方式有两种SET注入和构造器注入,开发中一般使用SET注入。
Spring的生命周期
1.实例化(比如Person p = new Person())
2.设置对象属性(比如p.setName(“jack”))
3.初始化 (执行bean标签中init-method属性指定的方法)
4.销毁(执行bean标签中destroy-method属性指定的方法)
作业
- 新建user表,字段有 id,username,password ,register_time,sex,age
- 使用Junit单元测试完成user表的新增,删除,更新,查询操作
- 使用spring+mybatis的技术实现