Day3 Spring IOC 注解
基于bean创建的
@Component
作用:指定类由Spring管理,相当于在xml中配置了一个bean;
属性:
- value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名(首字母小写)。
示例:
@Component
public class AccountService {
void create() {
System.out.println("创建账户成功。");
}
}
// 测试类中:
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
"com.bailiban.day3.spring_annotation.bean");
AccountService service = (AccountService) context.getBean("accountService");
service.create();
}
运行结果:
创建账户成功。
@Controller...
- @Controller:一般用于控制层;
- @Service:一般用于业务层;
- @Repository:一般用于持久层(数据库相关操作);
基于数据注入的
@Autowired
基于构造函数
用法:@Autowired用在构造函数上,Spring会根据构造函数的参数来注入。
示例:
@Service("accountService_constructor")
public class AccountService_Cons implements AccountService {
private AccountDao accountDao;
/**
* 通过构造函数注入
* @param accountDao
*/
@Autowired
public AccountService_Cons(AccountDao accountDao) {
this.accountDao = accountDao;
}
public void create() {
System.out.println(this.getClass().getAnnotation(Service.class).value());
accountDao.create();
}
}
测试:
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
"com.bailiban.day3.spring_annotation.autowire");
AccountService service = (AccountService) context.getBean("accountService_constructor");
service.create();
}
结果:
accountService_constructor
创建账户成功。
基于setter方法
用法:@Autowired用在setter方法上,Spring会根据setter方法来注入对于属性字段。
示例:
@Service("accountService_setter")
public class AccountService_Setter implements AccountService {
private AccountDao accountDao;
/**
* 通过setter方法注入
* @param accountDao
*/
@Autowired
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
public void create() {
System.out.println(this.getClass().getAnnotation(Service.class).value());
accountDao.create();
}
}
测试:
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
"com.bailiban.day3.spring_annotation.autowire");
AccountService service = (AccountService) context.getBean("accountService_setter");
service.create();
}
结果:
accountService_setter
创建账户成功。
基于字段
用法:@Autowired直接用于属性字段。
示例:
@Service("accountService_field")
public class AccountService_Field implements AccountService {
// 通过属性注入
@Autowired
private AccountDao accountDao;
public void create() {
System.out.println(this.getClass().getAnnotation(Service.class).value());
accountDao.create();
}
}
测试:
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
"com.bailiban.day3.spring_annotation.autowire");
AccountService service = (AccountService) context.getBean("accountService_field");
service.create();
}
结果:
accountService_field
创建账户成功。
@Qualifier
用法:当Spring容器中有多个相同类型的实例对象时,必须指定要注入的是哪一个对象。可以使用@Qualifier来指定bean的名称。
示例:
@Component
public class Client {
/**
* 当Spring容器中有多个相同类型的实例对象时,必须指定要注入的是哪一个对象。可以使用@Qualifier来指定bean的名称。
*/
@Autowired
@Qualifier("accountService_setter")
private AccountService accountService;
public AccountService getAccountService() {
return accountService;
}
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
"com.bailiban.day3.spring_annotation.autowire");
Client client = (Client) context.getBean("client");
client.getAccountService().create();
}
}
运行结果:
accountService_setter
创建账户成功。
@Resource
用法:当Spring容器中有多个相同类型的实例对象时,必须指定要注入的是哪一个对象。@Qualifier需要配合@Autowired使用,也可以单独使用@ReSource注解。
示例:
@Component("client2")
public class Client {
/**
* 当有多个实例对象时,必须指定要注入的是哪一个对象
* 注解@Resource可以替代 @Autowired + @Qualifier
*/
// @Autowired
// @Qualifier("accountService_setter")
@Resource(name = "accountService_field")
private AccountService accountService;
public AccountService getAccountService() {
return accountService;
}
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
"com.bailiban.day3.spring_annotation.autowire");
Client client = (Client) context.getBean("client2");
client.getAccountService().create();
}
}
运行结果:
accountService_field
创建账户成功。
基于生命周期的
见bean生命周期:https://www.cnblogs.com/cheng18/p/12064425.html
配置相关的注解
@Configuration
指定当前类是一个Spring配置类。
@ComponentScan
指定 spring 在初始化容器时要扫描的包。
@Bean
该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。
@PropertySource
用于加载.properties 文件中的配置。
示例:数据源配置
用于加载.properties 文件中的配置。
- jdbc.properties
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=123456
jdbc.driverClass=com.mysql.cj.jdbc.Driver
- DataSourceConfig配置类
@Configuration
@PropertySource("com/bailiban/day3/spring_annotation/config/jdbc.properties")
public class DataSourceConfig {
// 从jdbc配置文件获取数据库连接属性
@Value("${jdbc.jdbcUrl}")
private String jdbcUrl;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.driverClass}")
private String driverClass;
@Bean("dataSource")
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(jdbcUrl);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setDriverClassName(driverClass);
return dataSource;
}
}
测试:
public class Client {
public static void main(String[] args) throws Exception {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DataSourceConfig.class);
DataSource dataSource = (DataSource) context.getBean("dataSource");
Connection conn = dataSource.getConnection();
System.out.println(conn);
conn.close();
}
}
运行结果:
信息: {dataSource-1} inited
com.mysql.cj.jdbc.ConnectionImpl@4b79ac84