Spring装配对象的几种方式

1. Spring装配对象的几种方式

Spring最优秀的核心特点之一便是控制反转(IOC), 帮助开发人员来 管理和维护对象的生命周期 . 在Spring发展的历史长河中装配的方式也逐渐简化, 在这里我们可以简单的概括如下几种.

  • xml 文件配置方式.
  • 注解 配置方式
  • 配置类 配置方式
1.1 XML 文件配置方式
1.1.1 代码示例

意思如其名: 就是以 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">

    <!-- class指定装配的对象, id指定spring管理生命周期中的对象的名称-->
    <bean class="com.pyi.dao.UserDaoImpl" id="userDao">
        
    </bean>
</beans>

在这里我们要想获取装配的对象核心类ClassPathXmlApplicationContext, 代码如下:

// 在资源文件中获取配置文件
ClassPathXmlApplicationContext applicationContext = new 			           		ClassPathXmlApplicationContext("classpath:application-context.xml");
// 在Spring应用上下文获取装配的对象
UserDaoImpl userDao = (UserDaoImpl) applicationContext.getBean("userDao");
System.out.println(userDao);
applicationContext.close();
1.1.2 缺点
  • 编写繁琐.
  • 不利于代码的检查, 要是class/id编写错误, 编译器时发现不了错误的.
1.2 注解配置方式
1.2.1 代码示例

采用注解的方式让容器自动装配对象.

注解类定义如下:

/**
 * @author pyi
 * Component 是Spring的组件注解, 对象将会由Spring容器管理, value属性指示的是对象在容器中的名称
 */
@Component(value = "userDao")
public class UserDaoImpl implements UserDao {

    @Override
    public void getUser() {
        System.out.println("Hello");
    }
}

获取装配的对象核心类AnnotationConfigApplicationContext , 代码如下:

 // 定义注解扫描的包名(包名下所有的类只要包含 @Component 都会被装配到Spring容器中)
AnnotationConfigApplicationContext applicationContext = new 	AnnotationConfigApplicationContext("com.pyi");
UserDaoImpl userDao = (UserDaoImpl) applicationContext.getBean("userDao");
System.out.println(userDao);
1.2.2 缺点:
  • 在大型项目中难以对自动装配进行管理, 在组件扫描包中, 有的类为自动装配类有的类为非自动装配, 后期难以维护.
  • 再引入三方Jar包时, 三方的类是无法修改代码自动引入的.
1.3 配置类配置方式
1.3.1 代码示例

通过将要有IOC容器管理的类在配置类中定义.

配置类和获取对象的方式定义如下:

/**
 * Hello world!
 * Configuration 表明这是一个配置类, 可以将要装配的对象配置在这里
 */
@Configuration
public class App {

    /**
     *  Bean注解表明这是一个装配类, 对象将有IOC容器管理
     * @return UserDaoImpl 对象
     */
    @Bean
    public UserDaoImpl userDao() {
        return new UserDaoImpl();
    }

    public static void main(String[] args) {
        // 这里也是通过注解的形式注入装配类
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(App.class);
        System.out.println(applicationContext.getBean("userDao"));
    }
}
1.3.2 缺点
  • 有大量的需要IOC容器管理对象时, 需要编写的代码量比较大.

2. 总结

我们基于 约定大于配置 的理论, 一般的server, controller, repository, Mapper等 这些大家熟悉的类都用 自动装配 去处理, 对于一些自定义或者三方Jar包的类我们采用 类配置 的方式去处理.

3. 扩展

在总结上述三种方式代码的同时我们可以发现, 类装配 的方式和SpringBoot采用的方式很类似.

/**
 * @author pyi
 * SpringBootApplication 这里注解实质上就是一个 @Confuguration 注解, 表明这是一个装配类
 */
@SpringBootApplication
public class SpringbootDemoApplication {

	@Bean
	public UserDaoImpl userDao() {
		return new UserDaoImpl();
	}

	public static void main(String[] args) {
		// 在这里我们调用 SpringApplication的静态run方法来实现将配置信息装入IOC容器中
		ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringbootDemoApplication.class, args);
		System.out.println(applicationContext.getBean("userDao"));
	}
}

猜你喜欢

转载自blog.csdn.net/qq844579582/article/details/89101938