注解开发
§ 注解开发定义bean
bean代码
在实现类添加注解
@Component(id)
代替配置文件中的bean标签
- 默认id是该类首字母小写
@Component("bookDao")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book save dao");
}
}
配置文件
配置上下文相关来扫描
<context:component-scan base-package="com.itheima" />
衍生注解
增强可读性,对于
@Component
,提供相同功能的一下注解
@Controller
:用于表现层bean定义@Service
:用于业务层bean定义@Repository
:用于数据层bean定义
§ 纯注解开发
新建
config.SpringConfig
类来代替配置文件
- 注解
@Configuration
来指示该类是配置类- 注解
@ComponentScan
来指示扫描路径
- 多个扫描路径使用
{"com.1","com.2"}
的数组形式作为该注解value
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {
}
新建注解开发配置的IoC容器,实现类为
AnnotationConfigApplicationContext
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
§ bean管理
作用范围
使用
@Scope
注解
- singleton,单例
- prototype,非单列
@Component("bookDao")
@Scope("prototype")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book save dao");
}
}
生命周期
@PostConstruct
public void init() {
System.out.println("init");
}
@PreDestroy
public void destroy() {
System.out.println("destroy");
}
§ 依赖注入
自动装配
使用注解
@Autowired
实现自动注入数据层代码
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
public void save() {
System.out.println("book service save");
bookDao.save();
}
}
注意
默认按类型装配,使用了反射里的暴力反射注入,需要提供无参构造方法(默认),不用提供setter
如果有多个实现类,需要按名称装配
@Component
指定名称- 同时使用注解
@Autowired
和@Qualifier("bookDao")
来指定名称
注入简单类型
使用
@Value(V)
指定默认值
public class BookDaoImpl implements BookDao {
@Value("likuntong")
private String name;
public void save() {
System.out.println("book save dao");
System.out.println("name " + name);
}
}
加载外部properties文件的属性值
在配置类新增
@Proerties(FileName)
注解指定配置文件
- 不支持通配符
- 多个文件使用
{"1","2"}
的形式
@Configuration
@ComponentScan("com.itheima")
@PropertySource("jdbc.properties")
public class SpringConfig {
}
使用
${}
取配置值
@Repository
public class BookDaoImpl implements BookDao {
@Value("${jdbc.username}")
private String name;
public void save() {
System.out.println("book save dao");
System.out.println("name " + name);
}
}
§ 第三方bean管理
新建一个管理jdbc的配置类
- 基本类型成员使用
@Value
注入- 引用类型在
@Bean
方法上使用形参注入(按类型装配)
public class JdbcConfig {
@Value("ahh")
private String username;
// 1. 定义一个方法获得要管理的对象
// 2. 添加@Bean,表示当前方法的返回值是一个bean
@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(username);
ds.setPassword("root");
return ds;
}
}
使用
@Import()
导入
@Configuration
@Import({JdbcConfig.class})
public class SpringConfig {
}