Spring 入门

本文最后更新于: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">

<!-- class写对应类的路径 -->
<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");

// 内部参数未beanId的名字
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管理

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!