IOC/DI注解开发
1 注解开发定义bean
1.1
1 application不做配置
2 在dao上添加@Component注解
@Component
public class BookDaoImpl implements BookDao {
@Override
public void save() {
System.out.println("dao save");
}
}
3 开启注解扫描器
<context:component-scan base-package="com"></context:component-scan>
测试:
public class TestDemo1 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
BookDao bookDao = context.getBean(BookDao.class);
bookDao.save();
}
}
结果 :
说明:
1 component-scan
component:组件,Spring将管理的bean视作自己的一个组件
scan:扫描
base-package指定Spring框架扫描的包路径,它会扫描指定包及其子包中的所有类上的注解。
2 @Component注解如果不起名称,会有一个默认值就是当前类名首字母小写
,所以也可以按照名称获取
3 对于@Component注解,还衍生出了其他三个注解@Controller
、@Service
、@Repository
2 纯注解开发模式
2.1
1 新建配置类替换application.xml文件
2 Spring为了成为配置类需添加@Configuration注解
3 为了能将自定义bean放到容器需开启组件扫描 用组件扫描注解@CompoentScan 注解扫描可在()指定扫描范围
4 测试 测试类中不再加载配置文件 而是加载配置类 用AnnotationConfigApplicationContext 里面传入要加载配置类的字节码
public class TestDemo2 {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = context.getBean(BookDao.class);
bookDao.save();
}
}
结果如上
说明:
@Configuration注解用于设定当前类为配置类
@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式
@ComponentScan({com.service","com.dao"})
读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象
3 bean的作用范围
使用注解开发bean默认的单例 添加@Scope("prototype") 可设置为多例
4 bean的生命周期
1 添加@PostConstruct注解 在构造方法之后执行,替换 init-method
2 添加@PreDestroy注解 在销毁方法之前执行,替换 destroy-method
3 要想看到两个方法执行,需要注意的是destroy
只有在容器关闭的时候,才会执行,所以需要修改测试类
AnnotationConfigApplicationContext content = new AnnotationConfigApplicationContext(SpringConfig.class); 执行content.close方法
5 注解开发DI依赖注入
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
@Override
public void save() {
System.out.println("service save");
bookDao.save();
}
}
@Autuwired是根据类型注入的
如果接口有多个实现类 需要@Qualifier()按名称注入
@value()简单类型注入
6 注解开发管理第三方bean
1 前面定义bean的时候都是在自己开发的类上面写个注解就完成了,但如果是第三方的类,这些类都是在jar包中,我们没有办法在类上面添加注解,这个时候就需要用到@bean
@Configuration
public class SpringConfig {
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/db1");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
}
@Bean注解的作用是将方法的返回值制作为Spring管理的一个bean对象
public class TestDemo3 {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
DataSource dataSource = context.getBean(DataSource.class);
System.out.println(dataSource);
}
}
2 采用@Import 注解引入配置类
public class JdbcConfig {
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/db1");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
}
@Configuration
@Import(JdbcConfig.class)
public class SpringConfig {
}
说明:
@Import参数需要的是一个数组,可以引入多个配置类。
3 注解开发实现为第三方bean注入资源
注入简单数据类型
变为成员变量 用@value注入数据 引用成员变量
注入引用类型
引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象
定义bean的注解
@Compoent
@Service
@Controller
@Repositpry
属性注入的注解
@Autowired 定义在属性上方 按照属性类型自动装配
@Qualifier 和@Autowired一起使用 当接口有多个实现类时 需要根据名称注入
@Autowired默认按照类型自动装配,如果IOC容器中同类的Bean找到多个,就按照变量名和Bean的名称匹配。
自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值 无需提供setter方法
@Value 简单类型注入
配置类注解
@Configuration 将一个类标识为配置类
@CompoentScan 设置spring配置类扫描路径,用于加载使用注解格式定义的bean
@Import 导入配置类 value(默认):定义导入的配置类类名, 当配置类有多个时使用数组格式一次性导入多个配置类
管理第三方bean
@PropertySource 加载properties文件中的属性值 value(默认):设置加载的properties文件对应的文件名或文件名组成的数组
@Bean 将方法的返回值制作为Spring管理的一个bean对象
前面定义bean的时候都是在自己开发的类上面写个注解就完成了,但如果是第三方的类,这些类都是在jar包中,我们没有办法在类上面添加注解,我们就需要有一种更加灵活的方式来定义bean,@Bean这种方式不能在原始代码上面书写注解,但一样能定义bean
bean的生命周期注解
@PostConstruct 作用在方法上 设置该方法为初始化方法
@PreDestroy 作用在方法上 设置该方法为初始化方法
bean的作用域注解
@Scope value(默认):定义bean作用范围, 默认值singleton(单例),可选值prototype(非单例)