栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring全注解开发

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring全注解开发

Spring全注解开发

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

  • 环境准备

    1. 创建一个Maven项目

    2. 在Pom.xml中添加依赖

      
            org.springframework
            spring-context
            5.2.10.RELEASE
          
      
    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是用来设置此配置文件的作用范围,内部填写要设置的包名。代替了之前在配置文件中的

      
      
  • 添加创建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的依赖坐标

      
          com.alibaba
          druid
          1.1.16
      
      
    • 在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配置文件开发的区别

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/826691.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号