本文最后更新于:2022年1月16日 晚上
Spring入门
来偿还债务了,因为自己的懒惰和脑袋的短路而犯的错、延误的东西,自己再来弥补。
Spring的HelloWorld
1.新建maven项目
2.pom引入spring的配置
1 2 3 4 5 6 7
| <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.9</version> </dependency> </dependencies>
|
3.编写一个接口
4.在resources目录下新建spring的配置文件,applicationContext.xml
,配置文件可以随意命名,但是建议采用通用的名称。
1 2 3 4 5 6 7 8 9 10
| <?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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userDao" class="top.colourso.impl.UserDaoImpl"></bean> </beans>
|
5.编写主类,读取配置文件来获取spring管理的对象。
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class Main {
public static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDaoImpl userDao = (UserDaoImpl) context.getBean("userDao");
userDao.doing(); } }
|
6.最终结果
1 2 3 4
| 17:00:08.546 [main] DEBUG o.s.c.s.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@39a054a5 17:00:08.825 [main] DEBUG o.s.b.f.xml.XmlBeanDefinitionReader - Loaded 1 bean definitions from class path resource [applicationContext.xml] 17:00:08.859 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'userDao' 17:00:08.904 [main] INFO top.colourso.impl.UserDaoImpl - doing...
|
Spring的配置文件
1
| <bean id="userDao" class="top.colourso.impl.UserDaoImpl"></bean>
|
id
:唯一标识,不能重复
class
:类的全限定名,上述使用了类的无参构造来创建对象,若无无参构造则无法创建成功。
- 将类的构造函数设置为私有可以,为什么?
- 无无参构造就会报错,
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao'
scope
:表示对象的作用范围,
singleton
:默认值,单例
prototype
:多例
- request,session,global session做为了解,用于web项目
prototype配置
1 2 3 4 5 6 7 8 9 10 11
| public static void test2(){ logger.info("测试不同配置下的两个bean是否相同");
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDaoImpl userDao1= (UserDaoImpl) context.getBean("userDao");
UserDaoImpl userDao2= (UserDaoImpl) context.getBean("userDao");
logger.info("prototype: 1:{}",userDao1); logger.info("prototype: 2:{}",userDao2); }
|
结果:
1 2 3 4 5
| 17:36:24.942 [main] INFO top.colourso.Main - 测试不同配置下的两个bean是否相同 17:36:25.034 [main] DEBUG o.s.c.s.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1c6b6478 17:36:25.178 [main] DEBUG o.s.b.f.xml.XmlBeanDefinitionReader - Loaded 1 bean definitions from class path resource [applicationContext.xml] 17:36:25.247 [main] INFO top.colourso.Main - prototype: 1:top.colourso.impl.UserDaoImpl@ed9d034 17:36:25.248 [main] INFO top.colourso.Main - prototype: 2:top.colourso.impl.UserDaoImpl@4eb7f003
|
bean的创建时间对比
singleton
- 实例化一个对象
- 当Spring的核心文件被加载时,实例化配置的Bean实例
- 生命周期:创建容器时创建对象,当应用卸载时,销毁容器时,对象销毁
prototype
- 实例化多个对象
- 调用getBean()时实例化
- 生命周期:当使用对象时创建,当对象长时间不用时,Java垃圾回收期回收
bean的生命周期配置
可以指定对应的bean初始化和销毁的行为
1 2 3
| <bean id="userDao" class="top.colourso.impl.UserDaoImpl" init-method="init" destroy-method="destory"> </bean>
|
init-method
: 指定对应的初始化方法名
destroy-method
:指定销毁钱的方法名
bean的创建方法
无参构造
工厂静态方法创建
- ```
1 2 3 4 5 6 7 8
| - `factory-method`指定一个工厂类的静态方法
- 工厂实例方法创建
- ``` <bean id="factory" class="com.itheima.factory.DynamicFactory"></bean> <bean id="userDao" factory-bean="factory" factory-method="getUserDao"/>
|
- 要指定两个bean,工厂bean交给spring管理