spring安装本人的理解就是一艘航空母舰,其拥有很多不同的作战系统以及武器也可以与其他军事力量组装成一个航母战斗群。对应着我们的spring,其拥有从企业级到云计算等各个方面的技术栈,如下图所示:
Spring拥有很多项目有如:Spring Boot 、Spring Framework、Spring Cloud等等,这里就不在一一介绍,感兴趣的同学们可以去官方网站查询和了解。
Spring框架又是Spring技术栈的核心,Spring框架的IOC与AOP编程方式大大简化了Java企业级开发并极大提高了开发效率,并且Spring框架优秀的低浸入式降低了代码耦合性以及其他优秀的框架的集成,这些都让Spring框架成为一个非常受欢迎的Java开发框架。
Spring通过IOC容器管理Java Bean对象的创建以及其依赖。软件开发中经常会有写耦合性强的代码,通过Spring IOC可以很好帮我解决这个问题。IOC的核心是DI,通过DI可以设置不同Java Bean组件的依赖项,并在其整个生命周期都能管理这些依赖项。这些原先需要程序亲自创建并管理的工作交给了Spring容器实现,所以称为“控制反转”,IOC实现有两种方式:一是依赖注入,另一种就是依赖查找。
使用无参构造函数实例化对象
这里我们使用Maven构建我们的Spring应用,其依赖POM文件内容如下:
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<spring.version>5.2.5.RELEASEspring.version>
properties>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-oxmartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-txartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aopartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-context-supportartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-expressionartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-ormartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.8version>
dependency>
dependencies>
<build>
<finalName>Spring-FramerWorkfinalName>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.6.0version>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
plugins>
build>
创建简单类Student如下:
@Data
public class Student {
private String name;
private Integer age;
private String gender;
private String address;
public Student() {
}
public Student(String name, Integer age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
}
Spring元数据配置XML文件内容如下:
<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="student1" class="com.codegeek.day1.Student">
<property name="address" value="上海"/>
<property name="name" value="小明"/>
<property name="age" value="23"/>
<property name="gender" value="男"/>
bean>
beans>
上面的XML文件中,Id属性是标记一个bean对象的唯一标志,类似于我们生活中每个人对应的身份证一样,class属性定义Bean的类型也就是类的全路径。property属性对应Java Bean中的属性名称,而value就是对应Bean属性名的值。
新建Spring测试类如下:
public class SpringTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Student student1 = applicationContext.getBean("student1", Student.class);
System.out.println(student1);
}
}
ApplicationContext是高级工厂接口,能维护不同的Bean及其依赖项。其提供的getBean方法可以获取一个Bean的实例对象。运行结果显示我们确实获得了一个Student对象,而这个对象是由Spring容器为我们创建的。
整个项目结构如下所示:
public Student() {
System.out.println("Student.... 空参");
}
public Student(String name, Integer age, String address) {
System.out.println("Student.... 有参");
this.name = name;
this.age = age;
this.address = address;
}
public void setAddress(String address) {
System.out.println("address 被设置了");
this.address = address;
}
<bean id="student2" class="com.codegeek.day1.Student">
<property name="address" value="上海"/>
<property name="name" value="小红"/>
<property name="age" value="24"/>
<property name="gender" value="女"/>
bean>
No qualifying bean of type 'com.codegeek.day1.Student' available: expected single matching bean but found 2
的异常,根据类型获取Java Bean对象,需要满足Bean对象在IOC容器中具有唯一定义要求。使用有参构造函数实例化对象
Xml配置元数据如下所示:
测试类如下所示:
运行结果:
当Xml中value属性值类型与有参构造函数参数类型一致时可以省略name属性如下:
运行结果不变,但是这样配置可能出现一些问题,新增Xml元数据配置如下所示:
<bean id="student4" class="com.codegeek.day1.Student">
<constructor-arg value="张三"/>
<constructor-arg value="23"/>
<constructor-arg value="男"/>
<constructor-arg value="北京"/>
bean>
运行类如下:
运行结果如下所示:
我们发现运行结果属性名对应的属性值明显不符合实际生活逻辑,故xml可以改进如下所示:
再次运行测试类运行结果,一起正常如下所示:
静态工厂方法实例化对象
当采用静态工厂方法创建Bean时,除了指定class类型之外,还需要指定其工厂方法,以便容器初始化调用此方法完成类的初始化。
定义Xml数据如下:
定义实体类如下:
public class InstanceFactory {
public static Phone instance(String brandName, Double price, String producePlace) {
return new Phone(brandName,price,producePlace);
}
public Phone getPhone(String brandName,Double price,String producePlace) {
return new Phone(brandName,price,producePlace);
}
}
使用工厂方法实例化对象
此种配置需设置factory-bean
属性,而此属性的值必须是在IOC容器配置的,Xml配置如下所示:
测试类代码:
以上代码可在 codegeekgao.git 下载查看,下一章将重点学习和了解IOC容器依赖注入方式学习。