一、初识Spring
Spring可以轻松创建Java企业应用程序。它提供了在企业环境中使用Java语言所需的一切,支持Groovy和Kotlin作为JVM上的替代语言,并可根据应用程序的需要灵活地创建多种体系结构。从Spring Framework 5.0开始,Spring需要JDK 8+(Java SE 8+),并且已经为JDK 9提供了开箱即用的支持。
Spring是开源的。它拥有一个庞大而活跃的社区,可根据各种各样的实际用例提供持续的反馈。这有助于Spring在很长一段时间内成功发展。
Spring框架分为几个模块。应用程序可以选择所需的模块。核心是核心容器的模块,包括配置模型和依赖注入机制。除此之外,Spring Framework还为不同的应用程序体系结构提供了基础支持,包括消息传递,事务数据和持久性以及Web。它还包括基于Servlet的Spring MVC Web框架,以及Spring WebFlux响应式Web框架。
设计理念:
- 提供各个层面的选择。Spring允许您尽可能晚地推迟设计决策。例如,您可以通过配置切换持久性提供程序,而无需更改代码。许多其他基础架构问题以及与第三方API的集成也是如此。
- 适应不同的观点。Spring拥抱灵活性,并不认为应该如何做。它以不同的视角支持广泛的应用需求。
- 保持强大的向后兼容性。Spring的演变经过精心设计,可以在版本之间进行一些重大改变。Spring支持精心挑选的JDK版本和第三方库,以便于维护依赖于Spring的应用程序和库。
- 关心API设计。Spring团队投入了大量的思考和时间来制作直观的API,并且可以支持多个版本和多年。
- 为代码质量设定高标准。Spring框架强调有意义的,当前的和准确的javadoc。它是极少数项目之一,可以声称干净的代码结构,包之间没有循环依赖。
二、认识IoC容器
Spring中最为核心的部分就是IoC(控制反转)和AOP(面向切面编程)。
官方解释: IoC(Inversion of Control)也称为依赖注入——DI(Dependency Injection)。这是一个过程,通过这个过程,对象只能通过构造函数参数,工厂方法的参数或在从工厂方法构造或返回的对象实例上设置的属性来定义它们的依赖关系(即,它们使用的其他对象)。 然后容器在创建bean时注入这些依赖项。这个过程基本上是bean本身通过使用类的直接构造或诸如服务定位器模式之类的机制来控制其依赖关系的实例化(因此名称,控制反转)。
简单理解: ioc就是一个容器,传统的创建对象方式是new一个。在spring中,我们只需描述这个类的属性,注入到sping容器中,spring会自动帮我们创建。我们就不需要知道这个对象是如何创建的,只需要知道这个对象有什么属性,方法共我们使用即可。
在Spring中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。bean是一个由Spring IoC容器实例化,组装和管理的对象。 否则,bean只是应用程序中众多对象之一。Bean及其之间的依赖关系反映在容器使用的配置元数据中。
三、学会bean的注入和使用
第一种:xml方式
这是最简单的xml注入,class一定要是类的详细路径。
<bean id="serviceImpl" class="com.lzx.service.TestServiceImpl" />
属性注入
<bean id="author" class="com.lzx.entity.Author">
<property name="name" value="张伞"/>
<property name="sex" value="女"/>
<property name="height" value="164"/>
</bean>
构造函数注入
<bean id="book1" class="com.lzx.entity.Book">
<constructor-arg index="0" value="我的世界1"/>
<constructor-arg index="1" value="34"/>
<constructor-arg index="2" value="2002-12-12"/>
</bean>
集合注入
<bean id="authorBooks" class="com.lzx.entity.Author">
<property name="list">
<list>
<value>book1</value>
<value>book2</value>
</list>
</property>
<property name="map">
<map>
<entry key="key1" value="value1"/>
<entry key="key2" value="value2"/>
</map>
</property>
<property name="props">
]<props>
<prop key="prop1">value1</prop>
<prop key="prop3">value2</prop>
</props>
</property>
<property name="set">
<set>
<value>value1</value>
<value>value2</value>
</set>
</property>
<property name="array">
<array>
<value>value1</value>
<value>value2</value>
</array>
</property>
</bean>
ref引入其他bean
<bean id="authorBook" class="com.lzx.entity.Author" parent="author">
<property name="book" ref="book1"/>
</bean>
第二种:注解和代码形式
对于我们想要注入到spring容器中的类,你只需在该类上方加上 @Component 注解即可,让后就可以去扫描改类所在的包,就可以把这个类注入到容器中。
@Component // 该注解只能用到类上
public class TestServiceImpl1 implements TestService {
@Override
public void print() {
System.out.println("hello world");
}
}
java的形式配置包的扫描,使用 @ComponentScan 注解
@ComponentScan(basePackages = "com.lzx.service")
@Configuration // 该注解表示这是一个配置类,spring会自动加载这个类
public class SpringBeanConfig {
}
如果你说,我有一个类想注入到spring中,但又不在spring扫描的包里面,你可以使用 *@Bean *注解注入,或者说你不想让spring自动扫描包完成注入,想手动注入时。
@Configuration
public class SpringBeanConfig {
@Bean
public TestServiceImpl2 testServiceImpl2(){
return new TestServiceImpl2();
}
}
如果你已经把一些bean写入到xml文件中时,你也想把这些bean注入到spring中时,可以使用 @ImportResource 注解导入
@ImportResource(locations = "spring/spring-study.xml")
// 使用改注解同样可比将xml注入和下面的java注入混合使用
@Configuration // 等同于@Configuration
public class SpringBeanConfig {
}
最终混搭版——自动扫描+手动注入+xml配置,当然这种方式不建议使用,要么采用纯java方式注入,要么采用纯xml方式注入,便于我们日后的管理和维护。
@ImportResource(locations = "spring/spring-study.xml")
@ComponentScan(basePackages = "com.lzx.service")
@Configuration
public class SpringBeanConfig {
@Bean
public TestServiceImpl1 getTestService1() {
return new TestServiceImpl1();
}
@Bean
public TestServiceImpl2 getTestService2() {
return new TestServiceImpl2();
}
}
获取这些我们注入的bean也十分简单
// java配置读取
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringBeanConfig.class);
TestService bean = applicationContext.getBean(TestServiceImpl2.class);
bean.print();
自动注入 @Autowired 。直接在要使用这个bean的类里面注入,就可以调用该bean的公共方法了
@Autowired
TestServiceImpl service;
四、小结
IoC控制反转可能理解起来有点难。但是我们深入理解会发现这是一个很简单的东西,就是向容器里面放东西,然后取东西而已。IoC的容器就好比一个加工厂,我们通过java或xml的形式告诉它我们要什么样的bean,它会自动帮我们创建bean。我们在使用时只需使用@Autowired注解,注入bean即可。
最后,学会了IoC的注入,我们可以开始新的尝试,把所有有关spring使用xml配置的文件全部删掉,采用java+注解的形式来配置spring。具体配置会在下一篇博客中记录。