一、什么是注解

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

二、注解方式创建bean对象

  1、四种注解方式

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

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

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

  2、创建bean对象

实现步骤:

  1. 开启组件扫描
    开启组件扫描就是告诉你的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
    

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

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

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

三、实现属性注入

  1、属性注入的几种方式

  1. @Autowired:根据属性类型注入。
  2. @Qualifier:根据属性名称进行注入。
  3. @Resource:即可以根据类型注入,也可以根据名称注入。
  4. @Value:注入普通数据类型。

  2、几种属性注入实现过程

  1. @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();
    }

在这里插入图片描述

  1. @Qualifier:根据属性名称进行注入。
    Qualifier要与Autowired一起使用,Qualifier里面的value就是现在Autowired的对应实现类,比如一个接口可能会有很多歌实现类,Qualifier里面的名字就是实现类配置的名字。
    在这里插入图片描述
  2. @Resource:即可以根据类型注入,也可以根据名称注入。
    Resource注解用法和前面两种一样,在引用数据的上面加上@ Resource,如果是根据属性类型注入,直接@Resource,若是根据属性名注入,形如@Resource(name=“名称”)
    在这里插入图片描述
    在这里插入图片描述
  3. @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、完全注解开发的几种注解

  1. @Configuration:用于指定配置类,可以替代以前的xml文件,告诉容器有这个注释的配置类,创建容器时都会在该类上面加载。
  2. @ComponentScan:这个注解就是替代我们前面介绍的包扫描的那个标签,只需要在初始配置类加上这个注解就可以初始化容器想要扫描的包。
  3. @Bean:这个注解使用在方法上,用于返回在IOC容器里面加载的类,返回一个值作为容器里面的实例化。
  4. @PropertySource:加载.properties文件中的配置,比如连接的信息啊,连接驱动的注册,数据库地址,数据库用户名密码都可以用这个注解配置。
  5. @Import:用于导入其他的配置类,我们的配置类不可能就只有一个,有一个主的配置类会加载所有的配置类,xml用import标签,注解方式就用Import注解。

  2、几种注解的使用方法

  1. @Configuration
    表名该类是一个配置类,相当于xml配置文件
    在这里插入图片描述
  2. @ComponentScan
    注解我们想要扫描的包,相当于<context:component-scan base-package="com.example"></context:component-scan>
    在这里插入图片描述
  3. @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;
    }
}
  1. @PropertySource
    加载.properties文件中的配置,相当于<context:property-placeholder location="classpath:druid.properties"></context:property-placeholder>
//表示该类是一个配置类
@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;
    }
}
  1. @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

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

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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐