目录
一、纯注解开发
1.1 实现步骤
1.2 小结
二、注解开发依赖注入
2.1 自动装配
2.1.1 @Autowired——按照类型注入
2.1.2 @Qualifier——按照名称注入
2.1.3 @Value——简单类型注入
2.2 注解读取properties配置文件——@PropertySource
三、注解开发管理第三方Bean——@Bean
四、注解开发总结
Spring3.0开启了纯注解开发模式,使用Java类替代配置文件,开启了Spring快速开发赛道。即将配置文件applicationContext.xml删除掉,使用类来替换。
public interface BookDao {
public void save();
}
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ..." );
}
}
public interface BookService {
public void save();
}
public class BookServiceImpl implements BookService {
public void save() {
System.out.println("book service save ...");
步骤1:在实现类上添加注解
在Dao上添加注解
@Component("bookDao")
public class BookDaoImpl implements BookDao {
...
在Service上添加注解
@Component
public class BookServiceImpl implements BookService {
...
步骤2:创建配置类
创建一个配置类SpringConfig
步骤3:标识该类为配置类
在配置类上添加@Configuration注解
@Configuration
public class SpringConfig {
}
步骤4:用注解替换包扫描配置
在配置类上添加包扫描注解@ComponentScan
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {
}
步骤5:创建运行类并执行
public class AppForAnnotation {
public static void main(String[] args) {
ApplicationContext ctx = new
AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
System.out.println(bookDao);
BookService bookService = ctx.getBean(BookService.class);
System.out.println(bookService);
}
}
运行
1. Spring对于Bean的管理有四种注解,分别为:
2. ClassPathXmlApplicationContext是加载XML配置文件,AnnotationConfigApplicationContext是加载配置类
3. 想要把实现类变为非单例,只需要添加注解scope即可,例如:
@Repository
@Scope("prototype")
public class BookDaoImpl implements BookDao {
...
4. 配置文件与配置类的对比
Spring为了使用注解简化开发,并没有提供构造函数注入、setter注入对应的注解,只提供了自动装配的注解实现。
(1)准备工作:
出现问题:NullPointerException:Cannot invoke "com.itheima.dao.BookDao.save()" because "this.bookDao" is null
(2)原因
虽然在BookServiceImpl类中添加了BookDao的属性,并提供了setter方法,但是目前是没有提供配置注入BookDao的,所以bookDao对象为Null,调用其save方法就会报控指针异常。
(3)解决
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
...
这样,运行就可以成功了!
(4)小结
setter方法删除
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
如果根据类型找到了多个Bean对象,就可以使用@Qualifier指定注入哪个名称的Bean对象
@Service
public class BookServiceImpl implements BookService {
@Autowired
@Qualifier("bookDao1")
private BookDao bookDao;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
注意:@Qualifier不能独立使用,必须和@Autowired一起使用
@Repository("bookDao1")
public class BookDaoImpl implements BookDao {
@Value("itheima")
private String name;
...
此处的@Value并不是无用功,@Value一般会被用在从properties配置文件中读取内容进行使用。
步骤1:resource下准备properties文件【jdbc.properties】
步骤2:使用注解加载properties配置文件
@Configuration
@ComponentScan("com.itheima")
@PropertySource("jdbc.properties")
public class SpringConfig {
}
步骤3:使用@Value读取配置文件中的内容
@Repository("bookDao")
public class BookDaoImpl implements BookDao {
@Value("${name}")
private String name;
public void save() {
System.out.println("book dao save ..." + name);
}
}
运行
注意:
例如,在一个环境中完成对 Druid 数据源的管理,具体步骤为:
步骤1:导入对应的jar包
com.alibaba
druid
1.1.16
步骤2:在配置类中添加方法——@Import
第一种:直接在配置类SpringConfig中书写
@Configuration
public class SpringConfig {
public DataSource dataSource(){
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
如果把所有的第三方bean都配置到Spring的配置类SpringConfig中,会不利于代码阅读和分类管理,我们可以新建一个JdbcConfig配置类,并把数据源配置到该类下
public class JdbcConfig {
public DataSource dataSource(){
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;
}
}
然后在SpringConfig中通过@Import注解手动导入需要加载的配置类即可
@Configuration
@Import({JdbcConfig.class})
public class SpringConfig {
}
注意:
当然,我们不建议将数据库的四要素写死在代码里,可以通过加载配置文件,并使用@Value的形式实现,例如: SpringConfig配置类: JdbcConfig配置类 |
步骤3:在方法上添加@Bean注解
public class JdbcConfig {
@Bean
public DataSource dataSource(){
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;
}
}
@Bean的作用是:
步骤4:从IOC容器中获取Bean对象并打印
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new
AnnotationConfigApplicationContext(SpringConfig.class);
DataSource dataSource = ctx.getBean(DataSource.class);
System.out.println(dataSource);
}
}
笔记跟课:
https://www.bilibili.com/video/BV1Fi4y1S7ix/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=0e0517ebadf244dd640ab0b61dd700c5https://www.bilibili.com/video/BV1Fi4y1S7ix/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=0e0517ebadf244dd640ab0b61dd700c5