Spring-注解开发
一、注解开发
1.1 注解开发定义bean
-
1.使用
@Component
定义bean/** * @author: sea * @date: 2023/7/03 14:20 */ //使用@Component定义bean @Component("bookDao") public class BookDaoImpl implements BookDao { @Override public void save() { System.out.println("bookDao saving ... "); } }
-
2.在配置文件中配置组件扫描加载bean
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <!-- 2.配置组件扫描加载bean --> <context:component-scan base-package="com.sea.*"/> </beans>
-
补充:Spring提供
@Component
注解的三个衍生注解:@Service
:用于业务层bean定义;@Controller
:用于表现层bean定义;@Repository
:用于数据层bean定义;
-
【三个衍生注解功能与@Component相同,仅方便区分!!】
1.2 纯注解开发
-
Spring3.0升级了纯注解开发模式,使用Java类代替配置文件。
-
实现:
-
1.新建配置类代替配置文件:添加
@Configuration
注解修饰;@ComponentScan
配置组件扫描路径;/** * @author: sea * @date: 2023/7/4 14:49 */ @Configuration @ComponentScan({"com.sea.dao", "com.sea.service"}) public class SpringConfig { }
-
2.使用新的接口实现类获取Spring容器;
//AnnotationConfigApplicationContext接口实现类获取Spring容器,传入的参数为 配置类.class ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); BookService bookService = (BookService) ctx.getBean("bookService"); bookService.save();
-
二、依赖注入-自动装配
2.1 自动装配-引用类型
-
即使用
@Autowired
注解进行自动装配;【一般是按bean的类型装配,也可以按bean名称装配】 -
如下:
/** * @author: sea * @date: 2023/7/4 15:58 */ @Service("bookService") public class BookServiceImpl implements BookService { @Autowired @Qualifier("bookDao2")//相同类型的bean有多个,可以指定注入bean的名称 private BookDao bookDao; @Override public void save() { System.out.println("BookService saving ... "); bookDao.save(); } }
-
注意:
- 1.自动装配基于反射机制,能够创建对象并访问私有属性,因此可以不写set方法;
- 2.需要提供默认无参构造函数,否则无法创建bean对象;
- 3.相同类型的bean有多个时,可以使用
@Qualifier
指定注入bean的名称;【此处必须配合@Autowired
注解使用!】
2.2 自动装配-简单类型
-
可以通过
@Value
注解直接给简单类型装配值:@Value("abcdefg") String name;
-
也可以通过加载properties文件来装配:
jdbc.properties
文件
name=sea age=18
- SpringConfig类
@Configuration @ComponentScan({"com.sea.*"}) @PropertySource("classpath:jdbc.properties") //此处若有多个properties文件,使用数组形式,不能使用通配符 * public class SpringConfig { }
- BookDaompl类
public class BookDaoImpl implements BookDao { @Value("${name}") String name; @Value("${age}") int age; @Override public void save() { System.out.println("BookDao saving ... [" + name + ", "+ age + "]"); } }
2.3 第三方bean管理
-
例如,需要配置Druid数据库连接池。【前置工作:导入Druid坐标,刷新Maven】
-
**方式一:**直接在Spring配置类中增加一个方法,用于配置
/** * @author: sea * @date: 2023/7/4 16:45 */ @Configuration @ComponentScan("com.sea.*") public class SpringConfig { //1.定义一个方法获取要管理的bean对象 //2.给该方法的返回值添加@Bean,定义成Bean对象 @Bean("dataSource_druid") public DataSource dataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName("com.mysql.jdbc.Driver"); druidDataSource.setUrl("dbc:mysql://localhost:3306/springdb"); druidDataSource.setUsername("root"); druidDataSource.setPassword("123456"); return druidDataSource; } }
-
**方式二:**增加一个配置类
JdbcConfig
进行数据库连接池配置/** * @author: sea * @date: 2023/7/4 16:57 */ public class JdbcConfig { //1.定义一个方法获取要管理的bean对象 //2.给该方法的返回值添加@Bean,定义成Bean对象 @Bean("dataSource_druid") public DataSource dataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName("com.mysql.jdbc.Driver"); druidDataSource.setUrl("dbc:mysql://localhost:3306/springdb"); druidDataSource.setUsername("root"); druidDataSource.setPassword("123456"); return druidDataSource; } } /** * @author: sea * @date: 2023/7/4 16:45 */ @Configuration @ComponentScan("com.sea.*") @Import({JdbcConfig.class})//使用@Import注解将配置类引入即可 public class SpringConfig { }
-
向第三方bean注入简单类型和引用类型:
/** * @author: sea * @date: 2023/7/4 16:57 */ @PropertySource("classpath:mysql.properties") public class JdbcConfig { @Value("${driver}") private String driver; @Value("${url}") private String url; @Value("${username}") private String username; @Value("${password}") private String password; //1.定义一个方法获取要管理的bean对象 //2.给该方法的返回值添加@Bean,定义成Bean对象 //3.注入引用类型【通过方法参数形式自动装配(按类型装配)】 @Bean("dataSource_druid") public DataSource dataSource(BookDao bookDao){ System.out.println(bookDao); DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName(driver); druidDataSource.setUrl(url); druidDataSource.setUsername(username); druidDataSource.setPassword(password); return druidDataSource; } } /** * @author: sea * @date: 2023/7/4 16:45 */ @Configuration @ComponentScan("com.sea.*")//配置了组件扫描后,Spring容器初始化时就会创建扫描到的bean @Import({JdbcConfig.class})//使用@Import注解将配置类引入即可 public class SpringConfig { }
三、注解开发和xml配置对比
-
看图: