Spring-02

1.注解开发

  1. 为了简化配置,Spring支持使用注解代替xml配置。

2.Spring常用注解

2.0 注解开发准备工作

  1. 如果要使用注解开发必须要开启组件扫描,这样加了注解的类才会被识别出来。Spring才能去解析其中的注解。
  1. <!--启动组件扫描,指定对应扫描的包路径,该包及其子包下所有的类都会被扫描,加载包含指定注解的类-->
  2. <context:component-scan base-package="com.sangeng"/>

2.1 IOC相关注解

2.1.1 @Component,@Controller,@Service ,@Repository

  1. 上述4个注解都是加到类上的。
  2. 他们都可以起到类似bean标签的作用。可以把加了该注解类的对象放入Spring容器中。
  3. 实际再使用时选择任意一个都可以。但是后3个注解是语义化注解。
  4. 如果是Service类要求使用@Service
  5. 如果是Dao类要求使用[@Repository ](/Repository )
  6. 如果是Controllerl类(SpringMVC中会学习到)要求使用[@Controller ](/Controller )
  7. 如果是其他类可以使用[@Component ](/Component )

例如:

配置文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  6. <!--启动组件扫描,指定对应扫描的包路径,该包及其子包下所有的类都会被扫描,加载包含指定注解的类-->
  7. <context:component-scan base-package="com.sangeng"></context:component-scan>
  8. </beans>

类如下:

  1. @Repository("userDao")
  2. public class UserDaoImpl implements UserDao {
  3. public void show() {
  4. System.out.println("查询数据库,展示查询到的数据");
  5. }
  6. }
  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. @Component("phone")
  5. public class Phone {
  6. private double price;
  7. private String name;
  8. private String password;
  9. private String path;
  10. }
  1. @Service("userService")
  2. @Data
  3. @NoArgsConstructor
  4. @AllArgsConstructor
  5. public class UserServiceImpl implements UserService {
  6. private UserDao userDao;
  7. private int num;
  8. private String str;
  9. public void show() {
  10. userDao.show();
  11. }
  12. }

测试类如下:

  1. public class Demo {
  2. public static void main(String[] args) {
  3. //创建容器
  4. ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
  5. //获取对象
  6. UserDao userDao = (UserDao) app.getBean("userDao");
  7. Phone phone = (Phone) app.getBean("phone");
  8. UserService userService = (UserService) app.getBean("userService");
  9. System.out.println(phone);
  10. System.out.println(userService);
  11. System.out.println(userDao);
  12. }
  13. }

2.2 DI相关注解

  1. 如果一个bean已经放入Spring容器中了。那么我们可以使用下列注解实现属性注入,让Spring容器帮我们完成属性的赋值。

2.2.1 @Value

  1. 主要用于String,Integer等可以直接赋值的属性注入。不依赖setter方法,支持SpEL表达式。

例如:

  1. @Service("userService")
  2. @Data
  3. @NoArgsConstructor
  4. @AllArgsConstructor
  5. public class UserServiceImpl implements UserService {
  6. private UserDao userDao;
  7. @Value("199")
  8. private int num;
  9. @Value("三更草堂")
  10. private String str;
  11. @Value("#{19+3}")
  12. private Integer age;
  13. public void show() {
  14. userDao.show();
  15. }
  16. }

2.2.2 @AutoWired

  1. Spring会给加了该注解的属性自动注入数据类型相同的对象。

例如:

  1. @Service("userService")
  2. @Data
  3. @NoArgsConstructor
  4. @AllArgsConstructor
  5. public class UserServiceImpl implements UserService {
  6. @Autowired
  7. private UserDao userDao;
  8. @Value("199")
  9. private int num;
  10. @Value("三更草堂")
  11. private String str;
  12. @Value("#{19+3}")
  13. private Integer age;
  14. public void show() {
  15. userDao.show();
  16. }
  17. }
  1. **required属性代表这个属性是否是必须的,默认值为true。如果是true的话Spring容器中如果找不到相同类型的对象完成属性注入就会出现异常。**

2.2.3 @Qualifier

  1. 如果相同类型的bean在容器中有多个时,单独使用@AutoWired就不能满足要求,这时候可以再加上@Qualifier来指定bean的名字从容器中获取bean注入。

例如:

  1. @Autowired
  2. @Qualifier("userDao2")
  3. private UserDao userDao;

注意:该直接不能单独使用。单独使用没有作用

2.3 xml配置文件相关注解

@Configuration

  1. 标注在类上,表示当前类是一个配置类。我们可以用注解类来完全替换掉xml配置文件。
  2. 注意:如果使用配置类替换了xml配置,spring容器要使用:AnnotationConfigApplicationContext

例如:

  1. @Configuration
  2. public class ApplicationConfig {
  3. }

@ComponentScan

  1. 可以用来代替context:component-scan标签来配置组件扫描。
  2. basePackages属性来指定要扫描的包。
  3. 注意要加在配置类上。

例如:

  1. @Configuration
  2. @ComponentScan(basePackages = "com.sangeng")//指定要扫描的包
  3. public class ApplicationConfig {
  4. }

@Bean

  1. 可以用来代替bean标签,主要用于第三方类的注入。
  2. 使用:定义一个方法,在方法中创建对应的对象并且作为返回值返回。然后在方法上加上@Bean注解,注解的value属性来设置bean的名称。

例如:

  1. @Configuration
  2. @ComponentScan(basePackages = "com.sangeng")
  3. public class ApplicationConfig {
  4. @Bean("dataSource")
  5. public DruidDataSource getDataSource(){
  6. DruidDataSource druidDataSource = new DruidDataSource();
  7. druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
  8. druidDataSource.setUsername("root");
  9. druidDataSource.setUrl("jdbc:mysql://localhost:3306/mybatis_db");
  10. druidDataSource.setPassword("root");
  11. return druidDataSource;
  12. }
  13. }

注意事项:如果同一种类型的对象在容器中只有一个,我们可以不设置bean的名称。

具体写法如下:

  1. @Configuration
  2. @ComponentScan(basePackages = "com.sangeng")
  3. public class ApplicationConfig {
  4. @Bean
  5. public DruidDataSource getDataSource(){
  6. DruidDataSource druidDataSource = new DruidDataSource();
  7. druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
  8. druidDataSource.setUsername("root");
  9. druidDataSource.setUrl("jdbc:mysql://localhost:3306/mybatis_db");
  10. druidDataSource.setPassword("root");
  11. return druidDataSource;
  12. }
  13. }

获取方式如下:

  1. public static void main(String[] args) {
  2. //创建注解容器
  3. AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(ApplicationConfig.class);
  4. //根据对应类的字节码对象获取
  5. DataSource bean = app.getBean(DataSource.class);
  6. System.out.println(userService);
  7. }

@PropertySource

  1. 可以用来代替context:property-placeholder,让Spring读取指定的properties文件。然后可以使用@Value来获取读取到的值。
  2. **使用:在配置类上加@PropertySource注解,注解的value属性来设置properties文件的路径。**
  3. **然后在配置类中定义成员变量。在成员变量上使用@Value注解来获取读到的值并给对应的成员变量赋值。**

例如:

  1. jdbc.driver=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/mybatis_db
  3. jdbc.username=root
  4. jdbc.password=root

读取文件并且获取值

  1. @Configuration
  2. @ComponentScan(basePackages = "com.sangeng")
  3. @PropertySource("jdbc.properties")
  4. public class ApplicationConfig {
  5. @Value("${jdbc.driver}")
  6. private String driverClassName;
  7. @Value("${jdbc.url}")
  8. private String url;
  9. @Value("${jdbc.username}")
  10. private String username;
  11. @Value("${jdbc.password}")
  12. private String password;
  13. @Bean
  14. public DruidDataSource getDataSource(){
  15. DruidDataSource druidDataSource = new DruidDataSource();
  16. druidDataSource.setDriverClassName(driverClassName);
  17. druidDataSource.setUsername(username);
  18. druidDataSource.setUrl(url);
  19. druidDataSource.setPassword(password);
  20. return druidDataSource;
  21. }
  22. }

注意事项:使用@Value获取读到的properties文件中的值时使用的是${key},而不是#{key}。

3.如何选择

①SSM

  1. 自己项目中的类的IOCDI都使用注解,对第三方jar包中的类,配置组件扫描时使用xml进行配置。

②SpringBoot

  1. 纯注解开发