1. XML 配置
(1)配置过程:将 bean 信息配置在 XML 文件里,先通过 Spring 的 ApplicationContext 加载 XML 文件,再通过 getBean 方法获取 bean 的实例。
(2)优点:可以使用于任何场景,结构清晰,通俗易懂
(3)缺点:配置繁琐,不易维护,枯燥无味,扩展性差
(4)这种方式出现很多早前的 SSM 项目中,将第三方类库或者一些配置工具类都以这种方式进行配置,主要原因是由于第三方类不支持 Spring 注解。
────────────────────────────────────────────────────────────
2. XML 配置实现
(1)首先创建 spring-context.xml 文件
spring-context.xml 作用:用于注册 bean 信息、通常命名为 spring-context、springContext、ApplicationContext |
(2)声明命名空间和配置 bean。
|
|
────────────────────────────────────────────────────────────
3. Java 配置
(1)Java 配置原理:将 bean 的创建交给开发者配置的 JavaConfig 类来完成,Spring 只负责维护和管理,采用纯 Java 创建方式。其本质上就是把 XML 上的配置声明转移到 Java 配置类中。
(2)Spring 的 Java 配置方式是通过 @Configuration 和 @Bean 两个注解实现的:
@Configuration 作用于类上,相当于一个 XML 配置文件; @Bean 作用于方法上,相当于 XML 配置中的<bean> 标签; |
(3)优点:适用于任何场景,配置方便,因为是纯 Java 代码,扩展性高,十分灵活
(4)缺点:由于是采用 Java 类的方式,声明不明显,如果大量配置,可读性比较差
────────────────────────────────────────────────────────────
4. Java 配置实现
(1)创建一个配置类, 添加 @Configuration 注解声明为配置类
(2)创建方法,方法上加上 @bean,该方法用于创建实例并返回,该实例创建后会交给 Spring 管理,
方法名建议与实例名相同(首字母小写)。注:实例类不需要加任何注解 |
|
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeansConfig.class); UserDao userDao = (UserDao) context.getBean("userDao"); System.out.println(userDao); |
────────────────────────────────────────────────────────────
5. 注解配置
(1)通过在自定义类上加注解的方式,来声明一个类交给 Spring 管理,Spring 会自动扫描带有 @Component、@Controller、@Service、@Repository 这四个注解的类,然后创建并管理此对象,前提是需要先配置 Spring 的注解扫描器。
@Repository | 一般用于数据访问(数据访问(持久)层组件,实现 dao 访问) |
@Service | 一般用于服务( 业务层组件,处理业务逻辑,比如注入并操作 dao) |
@Controller | 一般用于控制器( 控制层组件 ) |
@Component | 一般用于自定义组件,把普通类实例化到 Spring 容器中,相当于配置文件中的<bean/> |
(2)注解配置必须通过 JavaConfig 或 XML 实现 Spring 的注解扫描器方可使用
(3)对于扫描到的注解类,Spring 默认当前 bean 在 IOC 容器中的 key 值为首字母小写的类名,可以在注解自定义 key 值
(4)优点:开发便捷,通俗易懂,方便维护。
(5)缺点:具有局限性,对于一些第三方资源,无法添加注解。只能采用 XML 或 JavaConfig 的方式配置
────────────────────────────────────────────────────────────
6. 注解配置实现
(1)对自定义类添加 @Component 相关的注解,比如 @Controller,@Service,@Repository
(2)配置 Spring 的注解扫描器:即 ComponentScan 的 basePackage
XML 方式配置 | <context:component-scan base-package='tech.pdai.springframework'>,多个包名间用逗号隔开。 |
Java 配置实现 | 在 JavaConfig 类添加注解 @ComponentScan("tech.pdai.springframework") 或 new AnnotationConfigApplicationContext("tech.pdai.springframework") 时指定扫描的 basePackage |
(3)注解配置结合 XML 实现 Spring 的注解扫描器
|
|
ApplicationContext applicationContext = new GenericXmlApplicationContext("spring-context.xml"); UserDaoImpl userDaoImpl = (UserDaoImpl) applicationContext.getBean("userDaoImpl"); System.out.println(userDaoImpl); |
(4)注解配置结合 JavaConfig 实现 Spring 的注解扫描器
|
ApplicationContext applicationContext = new GenericXmlApplicationContext("spring-context.xml"); UserDaoImpl userDao = (UserDaoImpl)applicationContext.getBean("userDaoImpl"); System.out.println(userDao); |
ApplicationContext applicationContext = new AnnotationConfigApplicationContext("com.qianfeng.dao"); UserDaoImpl userDao = (UserDaoImpl)applicationContext.getBean("userDaoImpl"); System.out.println(userDao); |