Reference:https://tycoding.cn/2018/05/23/Spring-1/
- Spring是一个轻量级的开源Java框架
- Spring的优势就是分层架构
- Spring的核心就是控制反转(IOC)和面向切面(AOP)
-
JavaEE开发分为三层结构:
-
Web层 –>SpringMVC
-
业务层 –>Bean管理(IOC)
-
持久层 –>Spring的JDBC模板、ORM模板用于整合其他持久层框架
-
Spring核心之装配Bean
Spring通过装配Bean对象来完成各个应用之间的协同合作,这也是依赖注入的本质。
而依赖注入即是我们前文提到的IOC
控制反转的思想–>通过将应用对象装配进Spring Bean
中,即由Spring管理对象的依赖关系。
创建Spring的配置
Spring是一个基于容器的框架,我们需要通过配置告诉Spring去加载哪些Bean和如果装配这些Bean。
- 配置Spring的方式有两种:
- 在XML文件中声明Bean
- 通过注解配置Spring
首先以下是一个基本的Spring XML配置:
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</bean>
在<beans>
元素内,可以配置所有的Spring的配置信息。而beans
不是唯一的Spring命名空间,Spring常用的命名空间有:
* aop: 为声明切面以及将@AspectJ注解的类代理为Spring切面提供了配置元素
* beans: 支持声明bean和装配bean,是Spring最基本的命名空间
* context: 为配置Spring应用上下文气功配置元素,包括自动检测和自动装配Bean、注入非Spring直接管理的对象
* jms: 为声明小气驱动的POJO提供配置元素
* mvc: 启用SpringMVC,例如面向注解的控制器、视图解析器和拦截器
* tx:提供声明式事务配置
声明一个简单的Bean
-
创建一个
HelloWorld.java类
package d20190124;
public class HelloWorld {
private String name;
public void setName(String name) {
this.name = name;
}
public void sayHello(){
System.out.println("hello " + name);
}
}
- 创建Spring的配置文件
spring-config.xml
,并将HelloWorld.java
交给Spring管理
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="hl" class="d20190124.HelloWorld">
<property name="name" value="nihao"></property>
</bean>
</beans>
- 创建Main.java类
package d20190124;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args){
/**
// 不使用Spring框架
// 1.创建一个HelloWorld的实例对象
HelloWorld hl = new HelloWorld();
// 2. 设置实例对象的name属性
hl.setName("nihao");
// 3. 调用对象的sayHello()方法
hl.sayHello();
**/
// 1. 创建一个Spring的IOC容器对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// 2. 从IOC容器中获取Bean实例
HelloWorld id = (HelloWorld) context.getBean("hl");
// 3. 调用sayHello()方法
id.sayHello();
}
}
结果:
解释:分析以上案例:我们首先创建一个JavaBean对象HelloWorld.java
,然后将这个JavaBean对象交给Spring管理—>即在Spring配置文件中注入。那么,Spring是怎么实例化这个名字叫hl的Bean的呢?
- 改进上述代码
package d20190124;
public class HelloWorld {
private String name;
public HelloWorld(){
System.out.println("这是一个无参构造函数.");
}
public void setName(String name) {
this.name = name;
}
public void sayHello(){
System.out.println("hello " + name);
}
}
即我们手动创建一个无参构造函数,结果如下:
解释:
可以看到,当我们手动创建一个无参构造函数时,定义在无参构造函数中的语句就会打印出来。原因是Spring实例化Bean采用了
HelloWorld hl = new HelloWorld();
的方式,并且会使用默认的无参构造函数进行实例化,而在Java中无参构造函数会被系统自动创建(在没有其他构造函数的情况下)。