Spring基本使用(一)——Spring基本配置与IOC容器用法

it2024-12-07  16

前言

本文不打算深入介绍Spring的一些概念,因为这种概念满大街都有,我觉得我也讲不好。我写这篇文章,主要原因在于我本身是搞C/C++出身,java开发是半路出家的,基本赶鸭子上架一般边用边学。所以架构师搭好了基本框架,我依葫芦画瓢的工作不难,但是要自己去搭框架,去调试比较深层的问题,总是会遇到很大麻烦。因此希望把一些的框框条条的内容记录下来。对于Spring完全不理解的朋友,请先看别的,对于Spring想要进阶的朋友,这文章也帮不了你。这文章更像是作为查询使用。

 

概述

关于IOC以及Spring容器这个概念,用我自己的话来说,简而言之,以前创建对象都是程序员自己new出来,这样会有几个不好的地方:1、作为程序开发人员,必须知道new的具体类是什么,因为不可能new一个interface;2、进行一些配置变更、程序扩展等等的时候,例如new的具体类名变了,程序好多处地方都必须修改,这对程序的入侵太强。

对IOC概念比较熟的读者可以基本忽略我上面说的。但是对于刚接触这个概念的小白来说,尤其是在校学生小白,估计一头雾水。第一点说程序员自己需要知道new一个具体类是什么,这不是理所当然吗?然而在多人开发,或者利用开源组件时,并不是这样的。例如架构师已经搭建了框架,利用某个开源的数据库连接组件,那么其他程序员使用这个组件时,通过IOC容器获取一个数据库连接接口类,便可以进行数据库连接以及增删查改,但程序员可能并不知道也不需要知道具体用的是哪个组件。第二点和第一点类似,如果没有IOC,某天架构师决定要换个数据库组件,那用到了数据库组件的其他程序员,都必须修改原来new的那个具体类。而如果利用IOC容器,则只是改改配置而已,不需要修改程序代码。

 

Spring基本配置

Spring的基本配置不难,用了maven之后更是简单,如此添加maven依赖即可:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ...... <properties> <spring-version>5.2.2.RELEASE</spring-version> </properties> <dependencies> ...... <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring-version}</version> </dependency> ...... </dependencies> ...... </project>

 

IOC容器基本使用

 IOC容器的使用最基础的方式纯XML文件配置。之后,又多了通过注解进行配置,形成XML+注解混搭的方式。再往后,也发展出通过纯java配置+注解这样无需XML的配置方式。我写相关的文章,主要是为了对比一下各种写法的差异,方便学习和查询。首先创建一个实体类:

public class Student { private int id; private String name; private int sex; private double score; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } }

这是一个很普通的Student实体类,用有几个属性并添加对应get、set方法。

纯XML配置IOC

在resource目录下新建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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="student" class="com.sadoshi.springtest.ioc.entity.Student"> <property name="name" value="jack"/> </bean> </beans>

第7行的class按具体的类进行设置。第8行为Student的name属性注入jack值。然后主程序进行测试:

public class App { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); Student student = context.getBean("student", Student.class); System.out.println(student.getName()); } }

得到输出jack,显然成功通过IOC容器创建并获取对应角色:

 

Java配置IOC

新建一个配置类MyConfig.class

@Configuration public class MyConfig { @Bean public Student myStudent() { Student student = new Student(); student.setName("mike"); return student; } }

注意注解@Configuration了,表示其实一个配置类,类似于导入一个xml文件。@Bean类似于<bean>标签(类似于factory-method方式创建)。

public class App { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class); Student student = context.getBean(Student.class); System.out.println(student.getName()); } }

通过AnnotationConfigApplicationContext获取上下文,输出结果,证明已获取正确student:

 

注解扫描

IOC相关的注解不能单独使用,必须要使用注解扫描的话,要让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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <bean id="student" class="com.sadoshi.springannotation.entity.Student"> </bean> <context:component-scan base-package="com.sadoshi.springannotation"/> <context:annotation-config/> </beans>

第7、8、13、14行是扫描所需注解必须的。

除了通过xml,还可以利用注解去设置要扫描的包。通常可以在主程序或者JAVA配置IOC的config文件中使用:

@ComponentScan(basePackages="com.sadoshi.springannotation") public class Application { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); MyClass cl = context.getBean(MyClass.class); System.out.println(cl.getName()); } }

如第1行所示,会扫描com.sadoshi.springannotation包下面的所有文件,寻找对应的注解。例如MyClass通过@Component这个注解,在Spring容器中创建一个实例。

@Component public class MyClass { private int id; @Value("ClassA") private String name; private List<Student> studentList; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Student> getStudentList() { return studentList; } public void setStudentList(List<Student> studentList) { this.studentList = studentList; } }

 

总结

XML是spring配置的基础。为了简化、或者使代码更具可读性,又有了注解,后面又多了纯Java配置方式。其实实际应用中,经常是混搭使用。理论上也没有说哪个更好。不过现在的开发,大型项目更注重代码可读性,在xml中写一大堆bean,看着都可怕。

最新回复(0)