1、注解
在之前的内容中说过,有三种方式完成依赖注入,那么这篇内容主要了解一下通过通过 Java 注解和 Java 代码方式依赖注入完成依赖注入。这三种方式都可以完成配置,但各有优劣。
Java 注解的方式中使用了一点 XML,而 Java 代码使用了注解。这两种方式都可以完成注解。当然这两种方式差不多,唯一的却别只是为了省略XML。
2、Java 注解
在这种方式中,我们还是需要使用到 XML的,那么下面我们先回顾一下XML如何完成配置的。
使用注解替代XML的配置,需要使用到如下注解:
@Component
:使用在类上,用于实例化Bean,对类所在的层没有任何要求@Controller
:使用在web层类上的,用于实例化Bean,只能用于web层@Service
:使用在service层类上的,用于实例化Bean,只能用于service层@Repository
:使用在dao层类上的,用于实例化Bean,只能用于dao层@Autowired
:使用在字段上用于根据类型注入@Qualifier
:需要和@Autowired
一起使用,根据名称进行依赖注入@Resource
:相当于@Autowired
和@Qualifier
的结合@Value
:使用在普通字段上@Scope
:标注Bean的使用范围@PostConstruct
:使用在方法上,用于标注该方法是Bean的初始化方法@PreDestroy
:使用在方法上,用于标注该方法是Bean的销毁方法
具体的使用方式如图:
-
配置:在类上添加注解配置 Bean
-
需要在XML的
<beans>
标签上添加两句代码:xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
-
需要添加组件扫描,用于告诉IOC容器那些类进行了注解。只需要写入一行代码就可以自动扫描:
<context:component-scan base-package="包名,那些包下面存在注解"/>
3、Java 代码
在上面讲述的这种注解方式,虽然不是通过XML进行配置的,但还是使用了XML文件。而这种方式和上述方式差不多,但没有使用 XML 了。
在使用上述注解进行配置时,出现一些是无法通过注解进行替代的:
- 非自定义的Bean,在某些时候需要用到第三方类,而在使用这些类的时候无法使用注解,因为你无法去修改这些第三方类的源码
- 加载 properties 文件的配置,properties文件是用于存放一些参数,例如数据库连接参数等等,而在XML中可以通过
<context:property-placeholder>
标签将文件中的数据库引入,通过${}
访问。 - 组件扫描的配置
<context:component-scan>
- 引入其他文件
<import>
而“新”注解完全可以解决上述四点,需要注解如下:
@Configuration
:用于指定当前类是一个Sping的配置类,当创建容器时会从该类上加载注解。这个注解是重点,在后面的 Spring 系列学习中会经常遇见@ComponentScan
:用于指定Spring 在初始化容器时需要扫描的包。@Bean
:使用在方法上,标注该方法的返回值存储到Spring容器中@PropertySource
:用于加载roperties 文件中的配置@Import
:用于导入其他配置类
上述五个注解使IOC容器彻底摆脱XML配置,使配置更加简单,而两种方式到底谁更加好,没人知道这个答案,我只能说存在即合理,各有优缺罢了。
因为彻底抛弃了XML文件,那么容器的使用也需要修改了,因为在之前容器的使用中,我们是通过ClassPathXmlApplicationContext
实例化的接口,而现在不在使用XML,则实例化接口的类也需要改变了,具体使用如下:
使用IOC容器的时候,只是修改了实例化接口的类,其他并没有改变。
如有错误请及时私信作者!