• 解析Spring第二天


    目的:使用spring中纯注解的方式

    前言:同样是使用idea创建一个普通的maven工程(如何创建一个普通的Maven工程可以参考mybatis入门第一天的详解)。

    bean管理类常用的4个注解(作用相同,推荐使用在不同分层上)

    ​ @Component 普通的类

    @Controller 表现层

    @Service 业务层

    @Repository 持久层

    依赖注入常用的注解

    @Value 用于注入普通类型(String,int,double等类型)

    @Autowired 默认按类型进行自动装配(引用类型)

    ​ @Qualifier 和@Autowired一起使用,强制使用名称注入

    @Resource Java提供的注解,也被支持。使用name属性,按名称注入

    对象生命周期(作用范围)注解

    @Scope 生命周期注解,取值singleton(默认值,单实例)和prototype(多例)

    以上具体的使用方式在以下的项目中在具体分析。

    首先看一下,搭建项目的结构

    • 引入开发需要的坐标

      

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     5     <modelVersion>4.0.0</modelVersion>
     6 
     7     <groupId>zh.test.spring</groupId>
     8     <artifactId>spring_day02</artifactId>
     9     <version>1.0-SNAPSHOT</version>
    10 
    11 
    12     <dependencies>
    13         <dependency>
    14             <groupId>org.springframework</groupId>
    15             <artifactId>spring-context</artifactId>
    16             <version>5.0.2.RELEASE</version>
    17         </dependency>
    18         <dependency>
    19             <groupId>commons-logging</groupId>
    20             <artifactId>commons-logging</artifactId>
    21             <version>1.2</version>
    22         </dependency>
    23         <dependency>
    24             <groupId>log4j</groupId>
    25             <artifactId>log4j</artifactId>
    26             <version>1.2.12</version>
    27         </dependency>
    28         <dependency>
    29             <groupId>junit</groupId>
    30             <artifactId>junit</artifactId>
    31             <version>4.12</version>
    32             <scope>test</scope>
    33         </dependency>
    34         <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
    35         <dependency>
    36             <groupId>com.alibaba</groupId>
    37             <artifactId>druid</artifactId>
    38             <version>1.1.13</version>
    39         </dependency>
    40 
    41         <dependency>
    42             <groupId>org.springframework</groupId>
    43             <artifactId>spring-test</artifactId>
    44             <version>5.0.2.RELEASE</version>
    45             <scope>test</scope>
    46         </dependency>
    47     </dependencies>
    48 </project>
    • 在demo文件下分别添加接口UserService和UserDaoService并分别实现接口》》》UserServiceImpl和UserDaoImpl。如下

      创建UserDaoService接口。

    1 package zh.test.demo;
    2 
    3 //编写一个简单的保存方法
    4 public interface UserDaoService {
    5     public void save();
    6 }

      实现UserDaoService接口,创建UserDaoImpl类

     1 package zh.test.demo;
     2 
     3 import org.springframework.stereotype.Repository;
     4 
     5 //在Dao(持久)层使用@Repository的注解方式,将这个类放到spring的IOC容器中
     6 @Repository("UserDao")
     7 public class UserDaoImpl implements UserDaoService {
     8     public void save() {
     9         System.out.println("持久层数据。。。");
    10     }
    11 }

      创建UserService接口,

    1 package zh.test.demo;
    2 
    3 public interface UserService {
    4     public void save();
    5 }

      实现UserService接口,创建UserServiceImpl。

     1 package zh.test.demo;
     2 
     3 import org.springframework.beans.factory.annotation.Autowired;
     4 import org.springframework.beans.factory.annotation.Qualifier;
     5 import org.springframework.beans.factory.annotation.Value;
     6 import org.springframework.stereotype.Component;
     7 
     8 import javax.annotation.Resource;
     9 import javax.naming.Name;
    10 
    11 //@Component
    12 //public class UserServiceImpl
    13 //   相当于
    14 //<bean id="userServiceImpl" class="zh.test.demo.UserServiceImpl"></bean>
    15 
    16 //@Component("us")
    17 //含义:把当前的类存放到IOC容器中,默认的ID值是首字母小写的类名。
    18 // 如果属性是value,而且只写了一个属性,那么value是可以省略不写的
    19 @Component("us")
    20 public class UserServiceImpl implements UserService {
    21 //    @Value("lebron") 给属性注入值,在使用这种方式给属性注入值得时候,那么就不用提供set方法也是可以的
    22     @Value("lebron")
    23     private String name;
    24 
    25 //    public void setName(String name) {
    26 //        this.name = name;
    27 //    }
    28 
    29     //@Autowired   按照类型注入  没有按照ID的方式注入(和ID没有关系)。
    30     //@Qualifier(value = "UserDao")  注入的时候根据名字注入。和UserDaoImpl 上注入的名字要相同。
    31     //如果使用@Resource(name = "UserDao") 这个方式注解,则这一个相当于上面那两个注解
    32 //    @Autowired
    33 //    @Qualifier(value = "UserDao")
    34 
    35     @Resource(name = "UserDao")
    36     private UserDaoService userDaoService;
    37 
    38 
    39     public void setUserDaoService(UserDaoService userDaoService) {
    40         this.userDaoService = userDaoService;
    41     }
    42 
    43     public void save() {
    44         userDaoService.save();
    45         System.out.println("注解的方式。。。"+name);
    46     }
    47 }
    • 在demo1的文件下使用纯注解的方式

      创建DeptService接口  

    1 package zh.test.demo1;
    2 
    3 public interface DeptService {
    4     public void find();
    5 }

      实现接口DeptService,创建类DeptServiceImpl

     1 package zh.test.demo1;
     2 
     3 import org.springframework.stereotype.Service;
     4 
     5 @Service("deptService")
     6 public class DeptServiceImpl implements  DeptService {
     7     public void find() {
     8         System.out.println("service.....");
     9     }
    10 }

      新建一个Java类为AnnotationProperties,当做配置文件使用,使用方式如下

     1 package zh.test.demo1;
     2 
     3 import com.alibaba.druid.pool.DruidDataSource;
     4 import org.springframework.context.annotation.Bean;
     5 import org.springframework.context.annotation.ComponentScan;
     6 import org.springframework.context.annotation.Configuration;
     7 
     8 import javax.sql.DataSource;
     9 
    10 @Configuration  //声明当前类是配置类
    11 @ComponentScan(value = "zh.test.demo1")    //指定扫描的包
    12 public class AnnotationProperties {
    13 
    14 //    @Bean注解    只能写在方法上,表明使用此方法创建一个对象,对象创建完成保存到IOC容器中
    15     /*
    16     <!--配置bean的标签-->
    17         <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    18             <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    19             <property name="url" value="jdbc:mysql://localhost:3306/xxx" />
    20             <property name="username" value="root" />
    21             <property name="password" value="root" />
    22         </bean>
    23      */
    24     @Bean(name = "dataSource")
    25     public DataSource dataSource()
    26     {
    27         DruidDataSource datasource=new DruidDataSource();
    28         datasource.setDriverClassName("com.alibaba.druid.pool.DruidDataSource");
    29         return datasource;
    30     }
    31 }
    • 在resources文件下创建一个applicationContext.xml的配置文件。在这里主要适用于配置开启注解扫描。  
     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" xmlns:util="http://www.springframework.org/schema/util"
     4        xmlns:context="http://www.springframework.org/schema/context"
     5        xsi:schemaLocation="http://www.springframework.org/schema/beans
     6                     http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
     7 
     8 <!--开启注解扫描,扫描包下的所有的类,看哪个类上有注解,把类放到IOC容器中-->
     9     <!--<bean id="userService" class="zh.test.demo"></bean>-->
    10     <!---->
    11     <context:component-scan base-package="zh.test"/>
    12 
    13 </beans>
    • 测试程序

      创建一个junitdemo的Java类来测试

     1 package zh.test.demo;
     2 
     3 import org.springframework.beans.factory.annotation.Autowired;
     4 import org.springframework.beans.factory.annotation.Qualifier;
     5 import org.springframework.beans.factory.annotation.Value;
     6 import org.springframework.context.annotation.Scope;
     7 import org.springframework.stereotype.Component;
     8 
     9 import javax.annotation.Resource;
    10 import javax.naming.Name;
    11 
    12 //@Component
    13 //public class UserServiceImpl
    14 //   相当于
    15 //<bean id="userServiceImpl" class="zh.test.demo.UserServiceImpl"></bean>
    16 
    17 //@Component("us")
    18 //含义:把当前的类存放到IOC容器中,默认的ID值是首字母小写的类名。
    19 // 如果属性是value,而且只写了一个属性,那么value是可以省略不写的
    20 
    21 
    22 //@Scope(value = "singleton")  默认是单例的,如果改成是多例的则换成prototype
    23 @Component("us")
    24 @Scope(value = "singleton")
    25 public class UserServiceImpl implements UserService {
    26 //    @Value("lebron") 给属性注入值,在使用这种方式给属性注入值得时候,那么就不用提供set方法也是可以的
    27     @Value("lebron")
    28     private String name;
    29 
    30 //    public void setName(String name) {
    31 //        this.name = name;
    32 //    }
    33 
    34     //@Autowired   按照类型注入  没有按照ID的方式注入(和ID没有关系)。
    35     //@Qualifier(value = "UserDao")  注入的时候根据名字注入。和UserDaoImpl 上注入的名字要相同。
    36     //如果使用@Resource(name = "UserDao") 这个方式注解,则这一个相当于上面那两个注解
    37 //    @Autowired
    38 //    @Qualifier(value = "UserDao")
    39 
    40     @Resource(name = "UserDao")
    41     private UserDaoService userDaoService;
    42 
    43 
    44     public void setUserDaoService(UserDaoService userDaoService) {
    45         this.userDaoService = userDaoService;
    46     }
    47 
    48     public void save() {
    49         userDaoService.save();
    50         System.out.println("注解的方式。。。"+name);
    51     }
    52 }

    测试纯注解的方式,创建testdemo1.java 文件。

     1 package zh.test;
     2 
     3 import org.junit.Test;
     4 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
     5 import zh.test.demo1.AnnotationProperties;
     6 import zh.test.demo1.DeptService;
     7 
     8 public class testdemo1 {
     9 
    10     @Test
    11     public void test1()
    12     {
    13         //创建工厂,加载配置类文件。
    14         AnnotationConfigApplicationContext factory = new AnnotationConfigApplicationContext(AnnotationProperties.class);
    15         DeptService deptService = (DeptService) factory.getBean("deptService");
    16         deptService.find();
    17     }
    18 }

     分享之路,欢迎交流。。。

  • 相关阅读:

    字符串比较
    String对象的简单方法(特别讲解length()方法的实现。
    Character类
    线性结构应用实例:多项式加法运算
    队列的顺序和链式存储实现
    堆栈用数组和用链表实现
    广义表和多重链表(十字链表)
    powerDesigner的name和comment转化
    jquery-validate
  • 原文地址:https://www.cnblogs.com/LBJLAKERS/p/11555794.html
Copyright © 2020-2023  润新知