IOC注解
用于创建对象的注解
使用注解之前需要在XML文件里面加上这句,否则注解产生的Bean不会出现在SpringIOC容器中
<context:component-scan base-package="com.lyl"></context:component-scan>
- @Component
作用:用于把当前类对象存入spring容器中
属性:value:用于指定bean的id,不写的时候 默认值为当前类名且首字母小写
@Component(value="accountService")
@Scope("singleton")
public class AccountServiceImpl implements AccountService {
@Resource(name="accountDao1")
private AccountDao accountDao;
}
}
- @Controller 表现层
- @Service 业务层
- @Repository 持久层
以上三个注解与Component的作用一致,起到语义化的作用
用于注入bean类型数据的注解
-
@ Autowired
作用:自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功
如果IOC容器中没有任何bean的类型和要注入的变量类型匹配,则报错
如果IOC有多个类型匹配(service里面的dao变量有多个实现类)时,首先先按照数据类型进行划分,再对变量名进行匹配
位置:
变量、方法上
好处:使用注解注入时,set方法就不是必须的了
鉴于上面多个实现类的问题 -
@Qualifier
作用:在按照类型中注入的基础之上再按照名称注入,(写在autowired下)他在给类成员注入时不能单独使用,但是在给方法参数注入时可以单独使用
属性:
value用于指定注入bean的id -
@ Resource
作用:直接按照bean的id注入,可以单独使用
属性:name用于指定注入bean的id
以上三个注解只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现
另外,集合类型的注入只能通过XML来实现
**注意:
对于 @Autowired
当一个接口有多个实现类的时候如何分辨当前这个类应该注入哪一个,他首先去这就要求这个Dao口的名字要和对应将实现类的加入容器的标签的value(id)一致
例子:比如有一个accountDao接口 有Dao1 和 Dao2实现类
当我们在一个类里面声明
一个`
@Autowired
private accountDao Dao;
而且在上面使用这个注解的时候,spring首先判断IOC容器是否有accountDao类型的Bean或者他的实现类,如果没有就判断是否有与Dao名字匹配的id的Bean,没有就报错
也就是说当我们声明为
private accountDao Dao1;
spring就会给我们注入Dao1实现类的Bean
为避免这种情况我们直接使用@Qualifier(“Dao2”)注解指定使用Dao2实现类进行注入,但是这个注解要放在Bean下
@Resource
注解则可以单独使用且指定id的Bean注入**
@Resource(name = "Dao2")
private AccountDao accountDao;
-
@ Value
作用:用于注入基本类型和String类型的数据
属性:value 值,可以使用spring中的spEL ${} -
@ Scope
作用:指定bean的作用范围, 用于改变作用范围的注解
属性:value singleton prototype
和生命周期相关的注解(了解) -
@ PreDestroy :指定销毁方法
@PostConstruct
public void init(){
System.out.println("初始化");
}
- @ PostConstruct :指定初始化方法
@PreDestroy
public void destroy(){
System.out.println("销毁");
}
纯注解代替XML配置文件
首先任意创建一个类
package com.lyl.config;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import javax.sql.DataSource;
/**
* 该类是一个配置类,用于与bean.xml一致
* spring新注解
* @ Configuration
* 作用:表明当前类是一个配置类
* 细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写
* @ ComponentScan
* 作用:用于通过注解指定spring在创建容器时要扫描的包等同于在xml配置了:<context:component-scan base-package="com.lyl"></context:component-scan>
* 属性:
* value和basePackages一致
*@ Bean
* 作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
* 属性:name:用于指定bean的id。默认值为当前方法的名称
* 细节:
* 当时用注解配置方法时,如果方法有参数,spring框架会去容器查找对应bean对象查找方式与autowired的方式一致
* @ Scope
* @ Import(jdbcConfig.class) 用于导入其他配置类
* @ PropertySource 导入参数文件
* 属性:路径 前面要加classpath
*/
@Configuration
@ComponentScans(@ComponentScan(basePackages = {"com.lyl"}))
@PropertySource("classpath:jdbc.properties")
public class SpringConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
/**
* 用于创建一个QueryRunner对象
* @param dataSource
* @return
*/
@Bean
@Scope("singleton")
public QueryRunner createQueryRuner(DataSource dataSource ){
return new QueryRunner(dataSource);
}
/**
* 创建数据源对象
* @return
*/
@Bean
public DataSource createDateSource(){
try{
ComboPooledDataSource ds=new ComboPooledDataSource();
ds.setDriverClass(driver);
//这里的 &不用转义符号 在XML才要
ds.setJdbcUrl(url);
ds.setUser(username);
ds.setPassword(password);
return ds;
}catch (Exception e){
throw new RuntimeException(e);
}
}
}
-
@Configuration
作用:表明当前类是一个配置类
细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写 -
@ComponentScan
作用:用于通过注解指定spring在创建容器时要扫描的包等同于在xml配置了:
<context:component-scan base-package=“com.lyl”></context:component-scan>
属性:
value和basePackages一致 -
@Bean
作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
属性:name:用于指定bean的id。默认值为当前方法的名称
细节:
当时用注解配置方法时,如果方法有参数,spring框架会去容器查找对应bean对象查找方式与autowired的方式一致 -
@Import(jdbcConfig.class) 用于导入其他配置类
-
@PropertySource 导入参数文件
属性:路径 前面要加classpath
要注意使用纯注解的时候得使用
AnnotationConfigApplicationContext作为ApplicationContext的实现类