想法由来
学习中,总会遇到一些问题,有学习中的,也有学习之外的,最重要的是坚持不懈,以往的笔记,记下来后,因为长时间不翻阅,或者翻阅不便等原因,一段时间后再去看,基本上已经不知道自己当初为什么这么写了。
因此,本人决定,开始写博客记录,也与大家共享,这是第一篇,记录了学习了Spring的心路历程。
重点概括
Spring基础篇中,最基础,也是最核心的部分Ioc,控制反转。
简单做一下概念记录,控制反转,即控制权限的反转,从传统的new一个对象,到将控制权交给Spring去管理,需要时,再从Spring容器中拿,无疑节省了许多步骤。
我们知道,Ioc与DI是密不可分的,这里,我做一个简单的总结,Ioc是控制权反转给Spring容器去进行管理,而DI则是依赖注入,将对象从容器中拿回来。
代码时间
首先,创建一个简单的SE工程,这里,使用当前最新的Spring版本。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.4</version>
</dependency>
</dependencies>
新建一个User类来进行测试
public class User {
private String id;
private String username;
private String address;
public User() {
System.out.println("User Init");
}
}
使用xml配置,新建一个applicationContext.xml,这里需要注意的是,必须在引入Spring依赖之后,才会有下面的新建xml文件选项。
<!-- bean注入容器中,完成初始化!-->
<bean class="org.tongzhou.model.User" id="user"/>
测试运行如下。
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
}
这里要注意的是,加载Spring容器的时候,就已经将User这个bean注入进去了,可以通过打印无参构造方法,就能看到,初始化的时候没有进行调用,无参构造方法依旧输出了打印。
我们使用有参构造方法注入看看。
<bean class="org.tongzhou.model.User" id="user">
<constructor-arg name="address" value="西安"/>
<constructor-arg name="id" value="1"/>
<constructor-arg name="username" value="同舟"/>
</bean>
调用看一下打印出来的值。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = ((User) applicationContext.getBean("user"));
System.out.println(user);
这里有一点需要注意的是,通过名称获取,需要强转一下,因为Spring容器并不知道,你所要的是什么类型的,当然,我们可以一开始就告诉他。
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = ((User) applicationContext.getBean("user"));
System.out.println(user);
User user1 = applicationContext.getBean("user", User.class);
System.out.println(user1);
}
上面,使用的是有参构造器注入,有时候我们只有一个无参构造器,那我们可以使用set方法注入,如下:
<bean class="org.tongzhou.model.User" id="user">
<property name="address" value="西安"/>
<property name="id" value="1"/>
<property name="username" value="同舟"/>
</bean>
有时候,我们会遇到一些比如特殊的属性,也可以采用注入的方式:
public class Book {
private String[] publish;
public Book(String[] publish) {
this.publish = publish;
}
@Override
public String toString() {
return "Book{" +
"publish=" + Arrays.toString(publish) +
'}';
}
}
public class User {
private String id;
private String username;
private String address;
private Book book;
}
xml中如下配置。
<!-- bean注入容器中,完成初始化!-->
<bean class="org.tongzhou.model.User" id="user">
<constructor-arg name="address" value="西安"/>
<constructor-arg name="id" value="1"/>
<constructor-arg name="username" value="同舟"/>
<constructor-arg name="book" ref="book"/>
</bean>
<bean class="org.tongzhou.model.Book" id="book">
<constructor-arg name="publish">
<array>
<value>清华出版社</value>
<value>机械工业出版社</value>
</array>
</constructor-arg>
</bean>
其他,特殊属性,如List,Map之类的也是相同的做法!