解析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 }

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

原文地址:https://www.cnblogs.com/LBJLAKERS/p/11555794.html