Spring实现IOC的方式有两种,一种是基于xml的方式,一种是基于注解的方式。
1. 基于xml配置文件的方式
这种方式需要熟悉spring xml配置。我们需要在spring官网找到spring基于xml的命名空间。进入spring core官方界面,在该界面搜索xmlns即可找到最基本的配置。如下图所示。
<?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="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
然后再基于此配置修改。
2. 基于注解的方式
基于注解的方式有两种,一种是半配置文件方式,一种是无配置文件方式。
2.1 半配置文件方式
半配置文件方式顾名思义就是注解和xml配置文件相结合的方式。
此时的配置文件的格式和完全使用配置文件的格式不相同,我们同样需要去spring core中搜索xmlns:context关键字即可找到基本配置。如下图所示。
<?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">
<context:component-scan base-package="org.example"/>
</beans>
只需要配置扫描注解的包即可。
2.2 无配置文件方式
无配置文件方式顾名思义就是完全由注解完成,没有任何xml配置文件的方式。
此处需要仔细介绍spring中的常用注解。介绍之前,我们先看一下 曾经的xml配置:
<bean id="accountDao" class="com.jinyuxin.spring051301.dao.impl.AccountDaoImpl" scope="" init-method="" destroy-method="">
<property name="" value="" | ref="" ></property>
</bean>
Spring注解大致可以分为四类:
(1)用于创建对象的;
(2)用于注入对象的;
(3)用于改变作用范围的;
(4)和生命周期相关的;
(5)和配置文件相关的。
以下分别介绍四类注解。
(1)用于创建对象的
@Component @Service @Controller @Repository
这四个注解都是将当前类作为一个JavaBean注册到Spring容器中,和基于xml配置文件中的<bean>标签作用完全一样。只不过后面三个注解是为了区分表现层、业务层、持久层三层结构,使用起来项目层次能够更加明确。因为作用都一样,所以你也可以混着用,不过这样项目质量就…你懂的。
这四个注解都有一个value属性,表示当前bean的id。默认的话,bean的id就是当前类首字母改成小写。
(2)用于注入数据的
他们的作用和xml配置文件中的 <property> 标签一样。
@Autowired
自动按照变量类型注入,只要spring容器中有唯一的一个bean对象和要注入的的变量类型匹配,就可以注入成功。
先按照变量类型找,如果容器中有多个相同类型的,然后再按照指定的id找。如果没有指定id,那么默认使用变量名作为id去找。
如果spring容器中有多个匹配时,
出现位置:一般是成员变量上。
@Qualify
在按照类型注入的基础上再按照id注入,给类成员注入时,不能单独使用,需要跟@Autowired一起用。给方法参数注入时,可以单独使用。它有一个value属性,用于指定id。
@Resource
全限定名称是:javax.annotation.Resource;
这个注解时jdk自带的注解,可以替代上述两个注解,注入的同时,再指定id进行匹配。有一个属性name用于指定id。
注意: 以上三个注解只能实现bean类型注入。基本数据类型和String类型无法使用上述注解实现。集合类型的注入只能通过xml来实现。
@Value
作用:用于注入基本数据类型和String类型。
属性:
value:用于指定数据的值。它可以使用spring中的SpEL。SpEL写法:${表达式}。
(3)用于改变作用范围的
他们的作用和xml配置中的scope属性一样。
作用:用于指定bean作用范围。
属性:
value:常用取值singleton和prototype。表示单例还是多例。默认是单例。
(4)和生命周期相关的
这种类型注解了解即可。
@PostConstruct:对应于xml配置中的init-method属性。用于方法上,表示方法在构造函数后执行。
@PreDestroy:对应于xml配置中的destroy-method属性。用于方法上,表示在对象被销毁前执行。
(5)和配置文件相关的
Spring新注解:
Configuration:
作用:指定当前类是一个配置类。
ComponentScan:
作用:用于通过注解指定spring在创建容器时要扫描的包。
属性:
value:它和basePackages作用是一样的,都是用于指定容器创建时需要扫描的包。
我们使用它等同于就是在xml中配置了:
<context:component-scan base-package="com.jinyuxin.spring051401"></context:component-scan>
两者结合使用就完全可以替代xml配置文件了。
3. 项目展示
3.1 全配置文件方式
3.2 半配置文件方式
3.3 无配置文件方式