Spring学习总结(三):基于注解的IOC

Spring IOC注解的快速入门

  • 创建工程并引入依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.22</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
  • 创建接口和实现类
public interface UserService {
    public void saveUser();
}

在实现类上添加注解@Component,相当于,value属性给bean指定id,value属性的名字也可以不写

@Component(value = "userService")
public class UserServiceImpl implements UserService{
    public void saveUser() {
        System.out.println("用户保存...");
    }
}
  • applicationContext.xml中引入约束
    因为现在想使用注解,那么引入的约束发生了变化,需要context的约束
<?xml version="1.0" encoding="UTF-8"?>
<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">
          <!-- 开启注解扫描 -->
   		  <context:component-scan base-package="com.ityang.service.impl"></context:component-scan>
</beans>
  • 测试
public class TestIOC {
    @Test
    public void test(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService)ac.getBean("userService");
        userService.saveUser();
    }
}

Spring框架中bean管理的常用注解

Spring中用于管理bean的注解分为四大类:

  1. 用于创建对象
  2. 用于给对象中的属性注入值
  3. 用于改变作用范围
  4. 用于定义生命周期
  • 用于创建对象:
    ① @Component
    作用:把资源让spring来管理,相当于在xml中配置一个bean。
    属性:value:指定bean的id。如果不指定value属性,默认bean的id是当前类的类名,首字母小写。
    @Controller @Service @Repository
    这三个注解都是针对@Component的衍生注解,他们的作用及属性都是一模一样的,只不过是提供了更加明确的语义化,为了让标注类本身的用途清晰。
    @Controller:一般用于表现层的注解。
    @Service:一般用于业务层的注解。
    @Repository:一般用于持久层的注解。
  • 用于给对象中的属性注入值
    用于注入数据的注解有:@Value;@Autowired;@Qualifier;@Resource
    相当于:<property name="" ref=""/> <property name="" value=""/>
    ① @Value
    作用:注入基本数据类型和String类型数据的
    属性:value:用于指定值
@Service("userService")
public class UserServiceImpl implements UserService {
	@Value("张三")
	private String name;
	@Override
	public void saveUser() {
		System.out.println("业务层:用户保存..." + name);
	}
}

② @Autowired
作用:自动按照类型注入。当使用注解注入属性时,set方法可以省略。它只能注入其他bean类型。当有多个类型匹配时,使用要注入的对象变量名称作为bean的id,在spring容器查找,找到了也可以注入成功。找不到就报错。

@Service("userService")
public class UserServiceImpl implements UserService {
	@Value("张三")
	private String name;	
	@Autowired
	private UserDao userDao;
	@Override
	public void saveUser() {
		System.out.println("业务层:用户保存..." + name);
		userDao.save();
	}
}

③ @Qualifier
作用:在自动按照类型注入的基础之上,再按照Bean的id注入。它在给字段注入时不能独立使用,必须和@Autowire一起使用;但是给方法参数注入时,可以独立使用。
属性:value:指定bean的id。

@Service("userService")
public class UserServiceImpl implements UserService {
	// 有多个bean都满足的情况下,优先注入bean的id与属性的名字一样的bean
	@Qualifier("userDao2")
	private UserDao userDao;
	
	@Override
	public void saveUser() {
		System.out.println("业务层:用户保存..." + name);
		userDao.save();
	}
}

④ @Resource
作用:直接按照Bean的id注入。它也只能注入其他bean类型。
属性:name:指定bean的id。
@Resource是按照bean的id来注入,只能注入对象类型

@Service("userService")
public class UserServiceImpl implements UserService {
	
	@Resource(name="userDao2")
	private UserDao userDao;
	@Override
	public void saveUser() {
		System.out.println("业务层:用户保存..." + name);
		userDao.save();
	}
}
  • 用于改变作用范围
    ① @Scope
    作用:指定bean的作用范围。
    属性:value:指定范围的值。 取值:singleton prototype request session globalsession
    @Scope指定bean的作用域,默认值是singleton,单例的。
@Service("userService")
@Scope("prototype")
public class UserServiceImpl implements UserService{

}
  • 用于定义生命周期
    相当于:<bean id="" class="" init-method="" destroy-method="" />
    ① @PostConstruct
    @PostConstruct加在方法上,指定bean对象创建好之后,调用该方法初始化对象,类似于xml的init-method方法
@Service("userService")
public class UserServiceImpl implements UserService {
	
	@Value("张三")
	private String name;
		
	public UserServiceImpl() {
		System.out.println("调用了无参构造方法...");
	}
	
	@PostConstruct
	public void init(){
		System.out.println("调用了init方法...");
	}
}

② @PreDestory
@PreDestory加在方法上,指定bean销毁之前,调用该方法,类似于xml的destory-method方法

	@PreDestroy
	public void destroy(){
		System.out.println("调用了destroy方法...");
	}

xml配置和注解的比较

  • 注解的优势:配置简单,维护方便。(我们找到了类,就相当于找到了配置)
  • XML的优势:修改时,不用改源码。不涉及重新编译和部署。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43365369/article/details/88807604