注解开发定义bean
- 使用 @Component 定义 bean , 括号里面可以认为是 id
@Component("bookDao")
public class BookDaoImpl implements BookDao {}
@Component
publuc class BookServiceImpl implements BookServicw {}
- 核心配置文件中通过组件扫描加载 bean
<context:component-scan base-package="com.itheima">
- Spring 提供 @Component 注解的三个衍生注解
- @Controller : 用于表现层 bean 定义
- @Service : 用于业务层 bean 定义
- @Repository : 用于数据层 bean 定义
- 总结:定义 bean
- @Component
- @Controller
- @Service
- @Repository
<context:component-scan/>
- @Component
纯注解开发
-
Spring3.0 升级了纯注解开发模式,使用Java类替代配置文件,开启了Spring快速开发赛道。
-
Java 类代替 Spring 核心配置文件
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {
}
- @Configuration 注解用于设定当前类为配置类
- @ComponentScan 注解用于设定扫描路径,此注解只能添加一次,多个数据请求数组格式
@ComponentScan({"com.itheima.service", "com.itheima.dao"})
- 读取Spring 核心配置文件初始化容器对象切换为读取 Java 配置类初始化容器对象
// 加载配置文件初始化容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
// 加载配置类初始化容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
- 总结:纯注解开发
- @Configuration
- @ComponentScan
- AnnotationConfigApplicationContext
bean作用范围与生命周期
- 使用 @Scope 定义 bean 作用范围
- 使用 @PostConstruct 、 @PreDestroy 定义 bean 生命周期
@Repository
@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 ...");
}
}
依赖注入——自动装配
- 使用 @Autowired 注解开启自动装配模式(按类型)
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
public void save() {sout("...")};
}
- 注意: 自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供 setter 方法。
- 注意: 自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法。
- 使用 @Qualifier 注解开启指定名称装配 bean
@Service
public class BookServiceImpl implements BookService {
@Autowired
@Qualifier("bookDao")
private BookDao bookDao;
}
-
注意: @Qualifier注解无法单独使用,必须配合 @Autowired 注解使用
-
使用 @Value 实现简单类型注入
@Value("100")
但是要加载 properties 文件时,应该这样做:
@Configuration
@ComponentScan("com.itheima")
//@PropertySource加载properties配置文件
@PropertySource({"classpath:jdbc.properties"})
public class SpringConfig {
}
注意: 路径仅支持单一文件配置,多文件请使用数组格式配置,不允许使用通配符 *
第三方 bean
第三方 bean 管理
- 使用独立的配置类管理第三方 bean
public class JdbcConfig {
@Bean
public DataSource dataSource(BookDao bookDao){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
ds.setUsername("root");
ds.setPassword("root");
return ds;
}
}
- 将独立的配置类加入核心配置
- 方式一:导入式 使用 @Import 注解手动加入配置类到核心配置,此注解只能添加一次,多个数据用数组格式
@Configuration
@ComponentScan("com.itheima")
//@Import:导入配置信息
@Import({JdbcConfig.class})
public class SpringConfig {
}
- 方式二:扫描式 不推荐使用
第三方 bean 依赖注入
- 简单类型注入和引用类型注入
- 简单类型注入:成员变量
- 引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象
public class JdbcConfig {
//1.定义一个方法获得要管理的对象
@Value("com.mysql.jdbc.Driver")
private String driver;
@Value("jdbc:mysql://localhost:3306/spring_db")
private String url;
@Value("root")
private String userName;
@Value("root")
private String password;
//2.添加@Bean,表示当前方法的返回值是一个bean
//@Bean修饰的方法,形参根据类型自动装配
@Bean
public DataSource dataSource(BookDao bookDao){
System.out.println(bookDao);
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(userName);
ds.setPassword(password);
return ds;
}
}