Spring框架教程(三):IOC基于注解的Bean管理

一、注解概述

  什么是注解:

  • 格式:注解是代码特殊标记,格式为 @注解名称(属性名称=属性值,属性名称=属性值…)。
  • 作用:作用在类、方法、属性上面。
  • 目的:简化xml配置。

  spring针对bean管理中创建对象提供的注解:

  • @Component
  • @Service
  • @Controller
  • @Repository

  spring针对bean管理中注入属性提供的注解:

  • @AutoWired 根据类型注入属性
  • @Qualifier 根据属性名称注入属性
  • @Resource 可根据名称,也可根据类型注入属性
  • @Value 注入基本类型或内置引用类(比如String)

二、创建对象

  为了与前面所学内容进行区分,我们新建一个项目spring5_demo1,从这章开始在新项目中演示。

(1)第一步:引入需要的jar包

  在项目下创建目录lib,把之前的项目中的lib下的jar包全部复制过来,在我们的电脑上的spring-5.2.6.RELEASE-dist文件夹下的libs文件夹下找一个新的jar包spring-aop-5.2.6.RELEASE,也放入lib中。

  导入jar资源:

  • 在IDEA项目中,依次点击文件-项目结构-模块-依赖,然后点击+号。
  • 找到刚刚复制进来的5个jar包的位置,选中它们,导入进来。
  • 点击Apply(应用),再点OK就可以了。

(2)开启组件扫描

  • 在src下创建bean.xml文件。
  • 引入context名称空间:
	<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"//添加
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context //添加
    http://www.springframework.org/schema/context/spring-context.xsd">//添加
  • 开启组件扫描,在xml的beans标签中配置:
	<!--开启组件扫描-->
    <context:component-scan base-package="com.wang"></context:component-scan>

(3)使用创建对象注解

  • 在com.wang下创建包service。
  • 再在service下创建类UserService,并加上相应的注解:
	package com.wang.service;
	import org.springframework.stereotype.Service;
	
	//相当于xml中<bean id="userService" class=...></bean>
	//注解的value属性可以省略不写,默认对象名就是首字母小写后的类名
	//Component、Service、Controller、Repository四个注解使用任意一个就行
	@Service(value="userService")
	public class UserSerivce {
    
    
	
	    public void add(){
    
    
	        System.out.println("service add...");
	    }
	}

(4)测试

  • 在com.wang下创建包test。
  • 在test下创建TestDemo类,执行方法:
	package com.wang.test;
	import com.wang.service.UserSerivce;
	import org.junit.jupiter.api.Test;
	import org.springframework.context.ApplicationContext;
	import org.springframework.context.support.ClassPathXmlApplicationContext;
	
	public class TestDemo {
    
    
	    @Test
	    public void testUserService(){
    
    
	        ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
	        UserSerivce userSerivce = context.getBean("userService", UserSerivce.class);
	        System.out.println(userSerivce);
	        userSerivce.add();
	    }
	}

在这里插入图片描述

三、组件扫描配置

  哪些扫描,哪些不扫描。看懂下面两个示例就行:

	<!--配置组件扫描示例1
    use-default-filters="false"表示使用自己配置的filter过滤器
    到com.wang中只扫描用@Controller注解的类-->
    <context:component-scan base-package="com.wang" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
 	<!--配置组件扫描示例2
    没有use-default-filters属性,表示使用默认配置的filter过滤器
    到com.wang中扫描所有内容,除了用@Controller注解的类-->
    <context:component-scan base-package="com.wang">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

四、属性注解

  前面已经说了,常用的注入属性的注解有下面三个:

  • @AutoWired 根据类型注入属性
  • @Qualifier 根据属性名称注入属性
  • @Resource 可根据名称,也可根据类型注入属性
  • @Value 注入基本类型或内置引用类(比如String)

  我们先在com.wang下面新建一个dao包。

(1)@AutoWired

  • 在dao下创建一个UserDao接口和对应的实现类UserDaoImpl,如下:
	package com.wang.dao;
	public interface UserDao {
    
    
	    void add();
	}
	
	@Repository//注意,注解写在实现类上而不是接口上
	public class UserDaoImpl implements UserDao {
    
    
	    @Override
	    public void add() {
    
    
	        System.out.println("dao add...");
	    }
	}
  • 修改一下UserService类,如下:
	package com.wang.service;
	
	import com.wang.dao.UserDao;
	import org.springframework.beans.factory.annotation.Autowired;
	import org.springframework.stereotype.Service;
	
	@Service
	public class UserSerivce {
    
    
	    @Autowired //根据类型注入
	    private UserDao userDao;
	
	    public void add(){
    
    
	        System.out.println("service add...");
	        userDao.add();
	    }
	}
  • 测试一下,测试代码没变化:
	@Test
    public void testUserService(){
    
    
        ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
        UserSerivce userSerivce = context.getBean("userService", UserSerivce.class);

        System.out.println(userSerivce);
        userSerivce.add();
    }

在这里插入图片描述

(2)@Qualifier

  要和@AutoWired一起使用。

	@Autowired //根据类型注入
    @Qualifier(value="userDaoImpl") //根据名称注入,如果同类型的有多个,可以定位到一个
    private UserDao userDao;

(3)@Resource

	@Resource//根据类型进行注入
    private UserDao userDao;
	@Resource(name="userDaoImpl)//根据名称进行注入
    private UserDao userDao;

(4)@Value

	@Value(value="abc")
    private String uname;

五、纯注解开发

  可以不使用甚至删除xml配置文件。

(1)创建配置类

  在com.wang下创建了config包,用来存放配置类SpringConfig(替代xml文件):

	package com.wang.config;
	import org.springframework.context.annotation.ComponentScan;
	import org.springframework.context.annotation.Configuration;
	
	@Configuration //作为配置类,替代xml文件
	@ComponentScan(basePackages = {
    
    "com.wang"}) //组件扫描配置
	public class SpringConfig {
    
    
	}

(2)编写测试类(和之前有所不同)

	@Test
    public void testUserService(){
    
    
        ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);
        UserSerivce userSerivce = context.getBean("userService", UserSerivce.class);

        System.out.println(userSerivce);
        userSerivce.add();
    }

  其他的还是照旧。

猜你喜欢

转载自blog.csdn.net/Tracycoder/article/details/112613341