1.什么是Spring
Spring是一款目前主流的 Java EE 轻量级开源框架,它是以IOC(控制反转)和AOP(面向切面编程)为内核。
2.Spring框架的优点
1.方便解耦,简化开发
2.支持AOP
3.方便程序的测试
4.方便集成各种优秀框架
3.Spring的体系结构
4.入门的第一个程序(基于Maven,IDEA版)
1.创建Module->Maven->选择“Create from archetype”->找到如图选项并创建好项目
2.在pom.xml的poject标签中配置以下代码导入包(配置完成不要忘记点击刷新)
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.16</version> </dependency> </dependencies>
3.创建com.dao包并创建UserDao.java(最好自己手敲一遍)
public interface UserDao { public void save(); }
4.在dao包中创建impl包并在impl包中创建UserDaoImpl.java
public class UserDaoImpl implements UserDao { public void save() { System.out.println("save running..."); } }
5.在resources文件夹中创建applicationContext.xml,在beans标签中添加
<bean id="userDao" class="com.dao.impl.UserDaoImpl"/>
6.在impl包下创建Test.java
public class Test implements UserService { public static void main(String[] args) { //1.初始化spring容器,加载配置文件 ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.通过容器获取userDao实例 UserDao userDao = (UserDao) app.getBean("userDao"); //3.调用实例中的save()方法 userDao.save(); } }
写完之后在Test.java中点击运行并看到save running...即为成功
5.Spring框架中配置文件的常用配置
在Spring中,XML配置文件(之前的applicationContext.xml)的<beans>中包含多个<bean>子元素,每一个<bean>子元素定义了一个Bean。在<bean>中同样包含了多个属性以及子元素:
1.id:是一个Bean的唯一标识符
2.class:该属性指定了Bean的具体实现类
3.scope:设定Bean实例的作用域。其中比较重要的两个属性值:
singleton(单例):无论如何实现类只有一个实例,对象在加载配置文件时创建,当应用卸载,销毁容器时,对象就被销毁了。
prototype(原型):Spring容器会为每个对该Bean的请求都创建一个新的实例,在每次getBean时创建对象,对象长时间不用时就会被Java垃圾回收器回收。
4.property:<bean>的子元素,用于调用Bean实例中的setter方法完成属性赋值,从而完成依赖注入。该元素的name属性用于指定Bean实例中相应的属性名,ref属性传入Bean的参数为对象时使用,value属性则为传入Bean的参数为普通值使用。在property元素还有3个子元素:
list:用于封装List或数组类型的依赖注入,用法如下
<property name="实例的列表名"> <list> <!--集合内数据为普通数据类型--> <value>123</value> <value>13</value> <value>12</value> <!--集合内数据为对象数据类型--> <!--<ref></ref>--> </list> </property>
map:用于封装Map类型属性的依赖注入
<property name="实例的Map名"> <map> <entry key="user1" value-ref="user1"/> <entry key="user2" value-ref="user1"/> </map> </property>
其中entry代表每一个键值对,entry元素中有key、value、key-ref、value-ref四种属性,不加-ref的为普通值,而加了-ref的为引用类型
props:用于封装Properties类型属性的依赖注入
<property name="properties"> <props> <prop key="123">popo</prop> <prop key="12">ppopo</prop> </props> </property>
6.依赖注入
依赖注入(DI)是控制反转(Ioc)的一种方式。
以往我们在一个类中需要调用另外一个类的方法,我们会通过new被调用类来创建对象,进而调用方法,这样做会使调用类与被调用类的耦合性增加。
在Spring框架中,不需要我们再去创建对象,而是由Spring容器来创建。这就是控制反转。
换句话来说,平常我们需要哪个类就调用调用哪个类,现在在Sping中,由Spring帮我们创建对象,我们只需要写配置文件,在方法类中加载配置文件,获取对应实例再调用实例中的方法即可。
依赖注入的实现方式有两种:
1.属性注入
2.构造方法注入
3.接口注入(还未学)
第一种方式实现如下:
一、在com包下创建service包并创建UserServicce类
public interface UserService { public void save(); }
二、在service包内创建impl包并在impl包下创建UserServicce类的实现类UserServiceImpl
public class UserServiceImpl implements UserService { //声明UserDao属性 private UserDao userDao; //添加UserDao属性的setteer方法,用于实现依赖注入 public void setUserDao(UserDao userDao) { this.userDao = userDao; } //实现接口中方法 public void save() { //调用userDao中的save()方法 this.userDao.save(); } }
三、在applicationContext.xml中的<beans>元素内配置
<bean id="userService" class="com.service.impl.UserServiceImpl">
<!--将id为userDao的Bean实例注入到userService实例中-->
<property name="userDao" ref="userDao"/>
</bean>
四、创建测试类Test
public class Test { public static void main(String[] args) { ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService) app.getBean("userService"); userService.save(); } }
运行测试类,你会发现在调用UserServiceImpl的方法的同时也调用了UserDaoImpl的方法,而代码上的改变只是在接口实现类声明UserDao属性并添加了属性的setter方法,并在配置文件的<bean>元素内加上<property>元素而已。
第二种方式实现(在第一种方式的基础上)如下:
一、在原有的applicationContext.xml文件中将第一种方式的配置注释,添加
<!--构造方法注入--> <bean id="userService" class="com.service.impl.UserServiceImpl" > <!--引用数据类型调用用 ref--> <constructor-arg name="userDao" ref="userDao"></constructor-arg> </bean>
二、在UserServiceImpl中把setUserDao方法注释,换为
public UserServiceImpl(UserDao userDao) { this.userDao = userDao; }
额外补充
1.在applicationContext.xml中可以将Bean的依赖注入写为以下形式:
<!--原来写法--> <bean id="userService" class="com.service.impl.UserServiceImpl"> <!--将id为userDao的Bean实例注入到userService实例中--> <property name="userDao" ref="userDao"/> </bean> <!--p命名空间--> <bean id="userService" class="com.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>
但是,要用p命名空间,需要在applicationContext.xml的beans元素中写入
xmlns:p="http://www.springframework.org/schema/p"
如图:
2.在Test类中的通过容器创建实例中有两种创建方法如下:
//两种方式创建UserService //第一种(根据id找到bean) UserService userService = (UserService) app.getBean("userService"); //第二种(仅在applicationContext.xml中相同Class只有一个bean的情况,否则报错) UserService userService = app.getBean(UserService.class);
7.Bean的实例化
实例化Bean有三种方式:构造器实例化、静态工厂实例化和实例工厂方式实例化
前边依赖注入 便是构造器实例化。
第二种静态工厂实例化的实现:
1.编写工厂类并在其中创建静态的放回值为Bean的方法
2.在配置文件中编写
<bean id="bean" class="你写的工厂类的相对路径" factory-method="工厂类的那个静态方法"/>
3.在测试类中
//1.初始化spring容器,加载配置文件 ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); // System.out.println(app.getBean("bean"));
第三种实例工厂方式实例化的实现:
1.编写工厂类并在其中创建放回值为Bean的方法
2.在配置文件中编写
<bean id="factory" class="你写的工厂类的相对路径"/>
<bean id="bean" factory-bean="factory" factory-method="工厂类中那个方法"/>
3.在测试类中
//1.初始化spring容器,加载配置文件 ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); // System.out.println(app.getBean("bean"));
这是我在
黑马程序员最全SSM框架教程|Spring+SpringMVC+MyBatis全套教程(spring+springmvc+mybatis)_哔哩哔哩_bilibili
学习的第一天的成果。