Spring全注解开发

Spring全注解开发

​ 为了更为简化程序的开发Spring的IOC和DI都提供了相应的注解来替代复杂的xml配置文件。下面通过一个简单的案例来演示。

  • 环境准备

    1. 创建一个Maven项目

    2. 在Pom.xml中添加依赖

      <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
          </dependency>
      
    3. 添加Dao和Service的模拟接口与其对应的实现类

      //Dao接口
      public interface Bookdao {
          public  void save();
      }
      //Dao实现类
      public class BookdaoImpl implements Bookdao {
          public void save() {
              System.out.println("Bookdao ...run");
          }
      }
      //Service接口
      public interface Bookservice {
          public void save();
      }
      //Service实现类:在内部调用了Dao方法
      public class BookserviceImpl implements Bookservice {
          private Bookdao bookdao;
          public void setBookdao(Bookdao bookdao) {
              this.bookdao = bookdao;
          }
      
          public void save() {
              System.out.println("Boolservice ... run");
              bookdao.save();
          }
          //初始化方法
          public void init(){
              System.out.println("Bean创建成功");
          }
          //销毁方法
          public void destory(){
              System.out.println("容器销毁");
          }
      }
      
      
    4. 添加一个运行类App

      public class App {
          public static void main(String[] args) {
            
          }
      }
      

注解开发定义Bean和定义配置类
  • 添加配置注解

    ​ 在用配置文件配置Spring中的Bean时,需要创建一个applicationContext.xml配置文件,再在配置文件中编写xml代码。使用注解只需要将一个类设置成配置类就行。具体如下:

    @Configuration
    @ComponentScan("com.itheima")
    public class SpringConfig {
    
    }
    
    
    • 在类上面添加**@Configuration**代表此类是一个Spring的配置类,可代替传统的applicationContext.xml配置文件。

    • @ComponentScan是用来设置此配置文件的作用范围,内部填写要设置的包名。代替了之前在配置文件中的

      <context:component-scan base-package="com.itheima"/>
      
  • 添加创建Bean注解

    ​ 在要到Spring容器中配置Bean的类上添加**@Component**注解即可,我在Dao和Service实现类上添加。

    //Dao配置Bean
    @Component("bookDao")
    public class BookdaoImpl implements Bookdao {
        public void save() {
            System.out.println("Bookdao ...run");
        }
    }
    //Service配置Bean
    @Component0("bookService")
    public class BookserviceImpl implements Bookservice {
        private Bookdao bookdao;
    
        public void setBookdao(Bookdao bookdao) {
            this.bookdao = bookdao;
        }
        public void save() {
            System.out.println("Boolservice ... run");
            bookdao.save();
        }
        //初始化方法
    
        public void init(){
            System.out.println("Bean创建成功");
        }
        //销毁方法
        public void destory(){
            System.out.println("容器销毁");
        }
    }
    
    

    添加@Component注解后,就可以调用Spring容器来创建相应的对象了。后面括号里的字符表示bean的id,可省略不写;不写的话会有一个默认的名称就是此类的名字,第一个字母小写。为了提高语义化,还可在对应的层用对应的注解来代替@ComPonent,有如下选择,它们的功能完全一样

    @Component设置Bean
    @Controller在控制层设置Bean
    @Service在表现层设置Bean
    @Repository在数据层设置Bean
  • 代码测试
    在运行类中测试一样,这里创建Spring容器的类和之前用配置文件创建容器使用的类不一样,具体代码如下

    public class App2 {
        public static void main(String[] args) {
            ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfig.class);
            Bookservice bookService = (Bookservice) app.getBean(Bookservice.class);
            bookService.save();
        }
    }
    

    测试结果
    在这里插入图片描述


    注解开发定义Bean的生命周期。
  • @Scope设置bean的作用范围
    在注解配置中的Bean默认是单例模式,要想Bean设置为多例模式,只需在类上面添加@Scope注解,在括号里进行相应设置:singleton单例;prototype非单例;

    //Service配置Bean
    @Component0("bookService")
    @Scope("prototype")
    public class BookserviceImpl implements Bookservice {
        private Bookdao bookdao;
    
        public void setBookdao(Bookdao bookdao) {
            this.bookdao = bookdao;
        }
        public void save() {
            System.out.println("Boolservice ... run");
            bookdao.save();
        }
        //初始化方法
    
        public void init(){
            System.out.println("Bean创建成功");
        }
        //销毁方法
        public void destory(){
            System.out.println("容器销毁");
        }
    }
    
    
    
  • 注解设置初始方法和销毁方法,只需要在方法上面添加@PostConstruct和@PreDestroy即可。\

      //初始化方法
    	@PostConstruct
        public void init(){
            System.out.println("Bean创建成功");
        }
    
        //销毁方法
    	@PreDestroy
        public void destory(){
            System.out.println("容器销毁");
        }
    

    可以看到,通过注解配置Spring要比用配置文件简单许多,下面来演示通过注解来进行Bean的依赖注入


注解开发依赖注入
  • 引用类型依赖注入:
    只需要在要注入的成员上加注解@Autowired,并且不需要set方法。此注解默认是按类型进行注入的,会自动在Spring中找到对应类型的Bean进行注入。

    @Repository
    @Scope("prototype")
    public class BookserviceImpl implements Bookservice {
        @Autowired
        private Bookdao bookdao;
        public void save() {
            System.out.println("Boolservice ... run");
            bookdao.save();
        }
        //初始化方法
    
        public void init(){
            System.out.println("Bean创建成功");
        }
        //销毁方法
        public void destory(){
            System.out.println("容器销毁");
        }
    }
    

    当根据类型在容器中找到多个bean,注入参数的属性名又和容器中bean的名称不一致,这个时候就需要使用到@Qualifier来指定注入哪个名称的bean对象。@Qualifier是在@Autowired的基础上使用的。

    @Repository
    @Scope("prototype")
    public class BookserviceImpl implements Bookservice {
        @Autowired
      	@Qualifier("bookDao")//括号内是Bean的id名
        private Bookdao bookdao;
        public void save() {
            System.out.println("Boolservice ... run");
            bookdao.save();
        }
        //初始化方法
    
        public void init(){
            System.out.println("Bean创建成功");
        }
        //销毁方法
        public void destory(){
            System.out.println("容器销毁");
        }
    }
    
    
  • 简单数据类型注入
    简单类型注入的是基本数据类型或者字符串类型,下面在BookserviceImpl类中添加一个name属性,用其进行简单类型注入

    @Repository
    @Scope("prototype")
    public class BookserviceImpl implements Bookservice {
        @Autowired
        private Bookdao bookdao;
    
        public void setBookdao(Bookdao bookdao) {
            this.bookdao = bookdao;
        }
    
        @Value("张三")
        private String name;
        public void save() {
            System.out.println("Boolservice ... run"+name);
            bookdao.save();
        }
        //初始化方法
    
        public void init(){
            System.out.println("Bean创建成功");
        }
        //销毁方法
        public void destory(){
            System.out.println("容器销毁");
        }
    }
    
    

    在App类中运行结果如下:
    在这里插入图片描述

    • @value一般会被用在从properties配置文件中读取内容进行使用。

      • 在resources下创建一个properties文件,在内部写点键值对。

        jdbc.driver=com.mysql.jdbc.Driver
        jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis
        jdbc.username=root
        jdbc.password=1234
        
      • 在配置类中加上@PropertySource()注解,将刚刚创建的properties文件引入
        在这里插入图片描述

      • 这样一来,Spring容器就可以读取到Properties文件了,在刚刚的代码中将@value注解中用${}来占位,里面填写键的值,就能把相应的值注入到变量中了

        @Value("${jdbc.driver}")
            private String name;
        
        • 运行App类

在这里插入图片描述


IOC/DI注解开发管理第三方bean

​ 在使用注解开发时,管理第三方Bean主要是用@Bean来完成,具体操作如下,

  • 用注解管理Druid数据源:

    • 在pom.xml中添加Druid的依赖坐标

      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.1.16</version>
      </dependency>
      
    • 在SpringConfig配置类中添加一个返回值为Bean的方法(本次案列是dataSource数据源对象)

      @Configuration
      public class SpringConfig {
          public DataSource dataSource(){
              DruidDataSource ds = new DruidDataSource();
              ds.setDriverClassName("com.mysql.jdbc.Driver");
              ds.setUrl("jdbc:mysql://localhost:3306/mybatis");
              ds.setUsername("root");
              ds.setPassword("1234");
              return ds;
          }
      }
      
    • 最后在方法名上添加@Bean注解就行了

      @Configuration
      public class SpringConfig {
        @Bean
          public DataSource dataSource(){
              DruidDataSource ds = new DruidDataSource();
              ds.setDriverClassName("com.mysql.jdbc.Driver");
              ds.setUrl("jdbc:mysql://localhost:3306/mybatis");
              ds.setUsername("root");
              ds.setPassword("1234");
              return ds;
          }
      }
      

      届时,有多少外部Bean要管理就配置几个方法就行了,但若是需要管理的Bean太多,就可以放在另外一个配置类,再通过@Impoet来引入到主配置类中,这样有利用Bena的管理。

      • 创建一个新的配置类,这里取名为jdbcConfig,在此类中定义返回值为Bean的方法,这里我还使用@Value配合Properties来给数据源的4要素进行赋值。

        public class jdbcConfig {
            @Value("${jdbc.driver}")
            private String driver;
            @Value("${jdbc.url}")
            private String url;
            @Value("${jdbc.username}")
            private String username;
            @Value("${jdbc.password}")
            private String password;
            @Bean
            public DataSource getDataSource(Bookdao bookdao){
              //  bookdao.save();
                DruidDataSource dataSource = new DruidDataSource();
                dataSource.setDriverClassName(driver);
                dataSource.setUrl(url);
                dataSource.setUsername(username);
                dataSource.setPassword(password);
                return dataSource;
            }
        
        }
        
        
      • 最后在SpringConfig配置类中加上@Import(jdbcConfig.class)即可

        @Configuration
        @ComponentScan("com.itheima")
        @PropertySource("jdbc.properties")
        @Import(jdbcConfig.class)
        public class SpringConfig {
        
        
        }
        
      • 在App类中演示一下

        public class App4 {
            public static void main(String[] args) {
                AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(SpringConfig.class);
                DataSource bean = app.getBean(DataSource.class);
                System.out.println(bean);
            }
        }
        
        
        • 演示结果:

      在这里插入图片描述

      最后总结一下注解开发和xml配置文件开发的区别
      在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值