03 基于注解的IOC
使用xml注解的时候 xml的配置
<bean id="accountService" class="com.it.service.impl.AccountServiceImpl"
scope="" init-method="" destroy-method="" >
<property name="" value="" | ref=""></property>
</bean>
1) 用于创建对象的
和在xml配置文件中编写一个<bean>标签实现功能是一样的
@component
作用:用于把当前类对象存入spring容器中,放在类上部
属性: @component(value=""):用于指定bean的id,当我们不写时,默认值是当前类名,且首字母改小写
@Controller:一般用于表现层
@Service:一般用在业务层
@Repository:一般用在持久层
以上三个是spring框架为我们提供明确的三层使用注解,使三层对象更加清晰
2) 用于注入数据的
<property>标签的作用是一样的
@Autowired 自动按照类型注入,只要容器中有唯一的一个bean对象类型与要注入的变量类型匹配,就可以注入成功。
出现位置: 变量、方法上
![](https://img.haomeiwen.com/i15128599/c1801f1e71b43c63.png)
@Qualifier
作用:在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。但是在给方法参数注入时可以
属性:vlaue:用于指定注入bean的id
必须和Autowired配合使用
![](https://img.haomeiwen.com/i15128599/fa86211c45835d2c.png)
@Resource
作用:直接按照bean的id注入。可以独立使用
以上三个注入都只能注入其他bean类型的数据,而基本数据类型和String类型无法使用上述注解实现。
另外,集合类型的注入只能通过XML来实现
@Value
作用:用于注入基本类型和String类型的数据
属性:value用于指定数据的值,可以使用spring中SpEL(spring的EL表达式)
SpEl的写法:${表达式}
用于改变作用范围的 @ Scope
相当于:<bean id="" class="" scope="">
@Scope
作用:用于指定bean的作用范围
属性: value:指定范围取值,常用取值 singleton prototype request session globalsession
和生命周期相关的 @PreDestroy @PostConstruct
相当于:<bean id="" class="" init-method="" destroy-method="" />
与xml中bean的init-method destroy-method 相似
@ PreDestroy:用于指定销毁方法
@ PostConstruct:用于指定初始化方法
![](https://img.haomeiwen.com/i15128599/be2412e337e88518.png)
spring 的纯注解配置
@Configuration
作用:用于指定当前类是一个 spring 配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext
(有@Configuration 注解的类.class)。
属性:value:用于指定配置类的字节码
@Configuration
public class SpringConfiguration {
}
我们已经把配置文件用类来代替了,但是如何配置创建容器时要扫描的包呢(通过扫描包中类上的容器注解 进行对象创建)?
@ComponentScan
用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:
<context:component-scan base-package="com.it"/>
是一样的。
@Configuration
@ComponentScan("com.it")
public class SpringConfiguration {
}
我们已经配置好了要扫描的包,但是数据源和 JdbcTemplate 对象如何从配置文件中移除呢?
@Bean
该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。
name:给当前@Bean 注解方法创建的对象指定一个名称(即 bean 的 id)
public class JdbcConfig {
/**
* 创建一个数据源,并存入 spring 容器中
* @return
*/
@Bean(name="dataSource")
public DataSource createDataSource() {
try {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setUser("root");
ds.setPassword("1234");
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql:///spring_day02");
return ds;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 创建一个 DBAssit,并且也存入 spring 容器中
* @param dataSource
* @return
*/
@Bean(name="dbAssit")
public DBAssit createDBAssit(DataSource dataSource) {
return new DBAssit(dataSource);
}
}
我们已经把数据源和 DBAssit 从配置文件中移除了,此时可以删除 bean.xml 了。
但是由于没有了配置文件,创建数据源的配置又都写死在类中了。如何把它们配置出来呢?
请看下一个注解。
@PropertySource
用于加载.properties 文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到
properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置。
属性:value[]:用于指定 properties 文件位置。如果是在类路径下,需要写上 classpath:
@PropertySource(value = "classpath:jdbc.properties")
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
/**
* 创建一个数据源,并存入 spring 容器中
* @return
*/
@Bean(name="dataSource")
public DataSource createDataSource() {
try {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass(driver);
ds.setJdbcUrl(url);
ds.setUser(username);
ds.setPassword(password);
return ds;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
jdbc.properties 文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/day44_ee247_spring
jdbc.username=root
jdbc.password=1234
此时我们已经有了两个配置类,但是他们还没有关系。如何建立他们的关系呢?
请看下一个注解
@Import 导入配置类
@Configuration
@ComponentScan(basePackages = "com.it")
@Import({ JdbcConfig.class}) //导入
public class SpringConfiguration {
}
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig{
}
我们已经把要配置的都配置好了,但是新的问题产生了,由于没有配置文件了,如何获取容器呢?
通过注解获取容器
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);