Spring 您所在的位置:网站首页 spring注解使用原理 Spring

Spring

#Spring| 来源: 网络整理| 查看: 265

文章目录 一、什么是注解二、注解方式创建bean对象  1、四种注解方式  2、创建bean对象三、实现属性注入  1、属性注入的几种方式  2、几种属性注入实现过程四、完全注解开发  1、完全注解开发的几种注解  2、几种注解的使用方法  3、测试全注解开发(实现查询数据库操作)

一、什么是注解

注解是特殊的标记形式,例如前面我们用servlet注解,filter注解。格式一般都是@注解名称(“注解内容”)。 注解可以用在类上,可以用在方法上,也可以用在属性上。 注解的作用是为了简化xml配置的,spring开发主要是轻代码,重注解的,所以简化xml配置文件十分重要。

二、注解方式创建bean对象   1、四种注解方式

注解实例化主要是简化xml里面bean标签实例化方式。例如如果bean标签格式是:那么对应注解格式就是@Component(“UserDao”),value值就是bean标签的id属性,而注解位置就是class属性里面的类路径。

@Component:创建对象最简单的注解。@Service:主要用在业务逻辑层创建对象的注解。@Controller:主要用在web层对象注解。@Repository:主要用在Dao层对象注解。

这四种注解方式都是平级的,并不是Service注解的内容其它层次就无法使用,分了三个层次注解主要是方便我们判断这个实例化是属于哪个层次,如果不知道这个对象属于什么层次,那就用Component注解表示就好。

  2、创建bean对象

实现步骤:

开启组件扫描 开启组件扫描就是告诉你的Spring容器,你的哪些包下面有注解创建实例化对象,如果有注解的就可以放在容器里面使用。需要将这两句放在图示位置,配置好context命名空间(这个命名空间和配置数据源里面的那个一模一样)

xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

在这里插入图片描述 命名空间配置好之后需要在下面写一个其中base-package就是你配置的bean对象的上一级包名,下面举例的userDao对象就是在com.example.dao包下的,所以包扫描路径到com.example就好了。如果需要扫描多个包,配置里面用逗号把包路径隔开就行。 组件扫描的细节:

1.当组件扫描形如下面的xml base-package:扫描哪个包目录下的注解类 use-default-filters:值为false时就把默认扫描关掉,只能扫描下面` `里面配置的配置类型,比如我配置的这个就只能扫描到Controller注解的类。 2.当组件扫描形如下面的xml base-package:扫描哪个包目录下的注解类 context:exclude-filter 子标签表示哪些注解不被扫描,例如我配了expression="org.springframework.stereotype.Service",那就说明用@Service注解的类都不会被扫描到。 创建类,在类上面注解 在这里插入图片描述 这个注解其实和 xml配置效果一样,只是注解开发方便很多。测试效果 @Test public void configTest001(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-Config.xml"); UserDao userDao = applicationContext.getBean("userDao", UserDao.class); userDao.save(); }

在这里插入图片描述 方法被调用说明UserDao已经配置到spring容器里面了。

三、实现属性注入   1、属性注入的几种方式 @Autowired:根据属性类型注入。@Qualifier:根据属性名称进行注入。@Resource:即可以根据类型注入,也可以根据名称注入。@Value:注入普通数据类型。   2、几种属性注入实现过程 @Autowired:根据属性类型注入。我演示在UserDaoImpl里面注入User属性。 (1)创建两个类UserDaoImpl和User类,在两个类上面都要注解。(第一步的注解)

在这里插入图片描述 在这里插入图片描述

(2)在UserDaoImpl里面注入User属性 直接在属性上面配置注解 @Component("userDao") public class UserDaoImpl implements UserDao { //通过属性名称注入 @Autowired private User user; @Override public void save() { System.out.println("Save方法被调用了~~~"); user.print(); } } (3)测试结果 运行结果里面有user类里面的方法打印,说明user属性引入成功了。 @Test public void configTest002(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-Config.xml"); UserDao userDao = applicationContext.getBean("userDao", UserDao.class); userDao.save(); }

在这里插入图片描述

@Qualifier:根据属性名称进行注入。 Qualifier要与Autowired一起使用,Qualifier里面的value就是现在Autowired的对应实现类,比如一个接口可能会有很多歌实现类,Qualifier里面的名字就是实现类配置的名字。 在这里插入图片描述@Resource:即可以根据类型注入,也可以根据名称注入。 Resource注解用法和前面两种一样,在引用数据的上面加上@ Resource,如果是根据属性类型注入,直接@Resource,若是根据属性名注入,形如@Resource(name=“名称”) 在这里插入图片描述 在这里插入图片描述@Value:注入普通数据类型。 这个注入方法就是注入普通数据类型的,比如int,String,Boolean等都是普通数据类型。使用的时候只需要在属性上面加上 @Value(“值”)就可以了。 @Component("userDao") public class UserDaoImpl implements UserDao { //通过属性类型注入 @Resource(name="user") private User user; @Override public void save() { System.out.println("Save方法被调用了~~~"); user.say(); } }

运行结果: 在这里插入图片描述 看到输出的配置的信息,证明这种方式配置普通数据类型的注解是可行的。

四、完全注解开发

spring是重配置而轻代码的框架,我们在开发过程中如果既有配置文件,又有注解,那还是显得特别的杂乱。那是否可以实现完全注解开发呢,也就是不需要利用xml配置文件,直接全部配置信息都用注解。你可能学了前面两步利用注解创建类,以及利用注解注入属性就说可以完成完全使用注解开发,是这样吗?显然还没有到达那种程度,前面注解的都是你自己定义的bean对象的实现类或者你自己想要注入的属性,那系统也有定义不同的类啊,难道你全部重构它的源代码,显然不可行。下面就介绍我们以前无法完成的注解。 在这里插入图片描述

  1、完全注解开发的几种注解 @Configuration:用于指定配置类,可以替代以前的xml文件,告诉容器有这个注释的配置类,创建容器时都会在该类上面加载。@ComponentScan:这个注解就是替代我们前面介绍的包扫描的那个标签,只需要在初始配置类加上这个注解就可以初始化容器想要扫描的包。@Bean:这个注解使用在方法上,用于返回在IOC容器里面加载的类,返回一个值作为容器里面的实例化。@PropertySource:加载.properties文件中的配置,比如连接的信息啊,连接驱动的注册,数据库地址,数据库用户名密码都可以用这个注解配置。@Import:用于导入其他的配置类,我们的配置类不可能就只有一个,有一个主的配置类会加载所有的配置类,xml用import标签,注解方式就用Import注解。   2、几种注解的使用方法 @Configuration 表名该类是一个配置类,相当于xml配置文件 在这里插入图片描述@ComponentScan 注解我们想要扫描的包,相当于 在这里插入图片描述@Bean 这个注解使用在方法上,用于返回在IOC容器里面加载的类,返回一个值作为容器里面的实例化。 //表示该类是一个配置类 @Configuration //配置我们想要扫描的包 @ComponentScan("com.example") public class DataSourceConfig { //相当于xml里面bean标签 @Bean("dataSource") public DruidDataSource getDataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/dbcsdn"); dataSource.setUsername("root"); dataSource.setPassword("1234"); return dataSource; } } @PropertySource 加载.properties文件中的配置,相当于 //表示该类是一个配置类 @Configuration //配置我们想要扫描的包 @ComponentScan("com.example") //记载properties文件里面的信息 @PropertySource("classpath:druid.properties") public class DataSourceConfig { @Value("${druid.driver}") private String driver; @Value("${druid.url}") private String url; @Value("${druid.username}") private String username; @Value("${druid.password}") private String password; //相当于xml里面bean标签 @Bean("dataSource") public DruidDataSource getDataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } } @Import: 用于导入其他的配置类,我们的配置类不可能就只有一个,有一个主的配置类会加载所有的配置类,xml用import标签,注解方式就用Import注解。 在这里插入图片描述   3、测试全注解开发(实现查询数据库操作)

基于上面的注解,实现查询数据库数据.

测试代码

@Test //测试全注解 public void configTest003() throws SQLException { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class); DruidDataSource dataSource = applicationContext.getBean("dataSource",DruidDataSource.class); DruidPooledConnection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); String sql = "select * from stu"; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()){ int id = resultSet.getInt("id"); String name = resultSet.getString("name"); String adr = resultSet.getString("adr"); int score = resultSet.getInt("score"); String gender = resultSet.getString("gender"); System.out.print("id:"+id+"\t"); System.out.print("username:"+name+"\t"); System.out.print("password:"+adr+"\t"); System.out.print("score:"+score+"\t"); System.out.println("gender:"+gender); } resultSet.close(); statement.close(); connection.close(); }

DataSource配置类

//表示该类是一个配置类 @Configuration //配置我们想要扫描的包 @ComponentScan("com.example") //记载properties文件里面的信息 @PropertySource("classpath:druid.properties") public class DataSourceConfig { @Value("${druid.driver}") private String driver; @Value("${druid.url}") private String url; @Value("${druid.username}") private String username; @Value("${druid.password}") private String password; //相当于xml里面bean标签 @Bean("dataSource") public DruidDataSource getDataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } }

配置总类

//在主配置文件里面引入分配置文件 @Import(DataSourceConfig.class) public class SpringConfig { }

properties文件

druid.driver=com.mysql.jdbc.Driver druid.url=jdbc:mysql://localhost:3306/dbcsdn druid.username=root druid.password=1234

数据库信息: 在这里插入图片描述

运行结果: 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有