注解开发定义bean
1.使用@Component 定义bean
@Component("bookDao")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
}
2.核心配置文件中通过组件扫描加载bean
<context:component-scan base-package="com.itheima"/>
3.@Component定义bean,三个衍生的注解,功能一致,需要配置文件扫描标签
业务层使用@service ,数据层使用@ Repository ,控制层@ controller
纯注解开发
spring3.0 升级了纯注解开发模式
1.不需要使用配置文件
//声明当前类为Spring配置类
@Configuration
//设置bean扫描路径,多个路径书写为字符串数组格式
@ComponentScan({"com.itheima.service","com.itheima.dao"})
public class SpringConfig {
}
public class AppForAnnotation {
public static void main(String[] args) {
//AnnotationConfigApplicationContext加载Spring配置类初始化Spring容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
System.out.println(bookDao);
//按类型获取bean
BookService bookService = ctx.getBean(BookService.class);
System.out.println(bookService);
}
}
2.java类替代spring 核心配置文件
//声明当前类为Spring配置类
@Configuration
//设置bean扫描路径,多个路径书写为字符串数组格式
@ComponentScan({"com.itheima.service","com.itheima.dao"})
3.读取spring核心配置文件初始化容器对象切换为java 配置类初始化容器对象
//加载配置文件初始化
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//加载配置类初始化
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
容器获取变为AnnotationConfigApplicationContext
bean作用范围和生命周期管理
作用范围
@scope使用来定义bean的作用范围
@Repository
//@Scope设置bean的作用范围
@Scope("singleton")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
//@PostConstruct设置bean的初始化方法
@PostConstruct
public void init() {
System.out.println("init ...");
}
//@PreDestroy设置bean的销毁方法
@PreDestroy
public void destroy() {
System.out.println("destroy ...");
}
}
生命周期
使用 @PostConstruct设置bean的初始化方法
@PreDestroy设置bean的销毁方法
注解开发依赖注入
使用@Autowired 注解开启自动装配模式(按类型),可以不用set方法
@Autowired
private BookDao bookDao;
自动装配式基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法
自动装配建议使用无参构造方法创建对象,如果不是提供对应的构造方法,需要提供唯一的构造方法
使用@qualifier 注解开启指定名称装配bean,并且无法单独使用
@Autowired
//@Qualifier:自动装配bean时按bean名称装配
@Qualifier("bookDao")
关于spring 配置并且依赖注入
1.配置一个文件
1.spring bean 配置
@Configuration
@ComponentScan("com.itheima")
//@PropertySource加载properties配置文件
@PropertySource({"jdbc.properties"})
public class SpringConfig {
}
2.注入依赖
@Repository("bookDao")
public class BookDaoImpl implements BookDao {
//@Value:注入简单类型(无需提供set方法)
@Value("${name}")
private String name;
public void save() {
System.out.println("book dao save ..." + name);
}
}
3.自动装配
@Service
public class BookServiceImpl implements BookService {
//@Autowired:注入引用类型,自动装配模式,默认按类型装配
@Autowired
//@Qualifier:自动装配bean时按bean名称装配
@Qualifier("bookDao")
private BookDao bookDao;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
4.打印输出
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookService bookService = ctx.getBean(BookService.class);
bookService.save();
}
}
读取到配置文件里的数据
总结: 使用 @PropertySource 注解properties加载文件,路径仅支持单一文件配置,多文件使用数组格式,不允许使用通配符*
@PropertySource({"jdbc.properties"})
注解开发实现第三方bean注入资源
引用类型依赖注入 @ Bean
引用注入类型只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象
引用类型:方法形参
简单类型: 成员变量
总结
XML配置和注解配置对比
定义bean的方式不同
注解使用@component (service,controller,repository) @componentscan
xml配置使用bean 标签 id属性和class属性
设置依赖注入
xml使用的式setter注入(引用 简单) 构造器注入(引用,简单),自动装配
注解使用的是@Autowired (@Qualifier) @value
配置第三方 bean
xml :bean 标签 静态工厂, 实例工厂,factoryBean
注解: @ bean
作用范围
xml属性: scope属性
注解:@scope
生命周期
标准接口 init-method destroy-method
@Postconstructor @ Predestroy