Spring5学习笔记——IOC操作之Bean管理(注解实现)

IOC操作—Bean管理

基于注解实现

创建对象

  1. 什么是注解?
    (1)注解是代码的特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值…)
    (2)注解的使用:注解作用在类上面,方法上面,属性上面
    (3)使用注解目的:简化 xml 配置

  2. Spring 针对 Bean 管理,提供如下注解,用于创建对象
    (1)@Component
    (2)@Repository,常用于 DAO 层
    (3)@Service,常用于 service 层
    (4)@Controller,常用于 web 控制层
    注意,上面四个注解的功能是一样的,都可以用来创建 bean 实例,注解内的 value 属性值可以省略不写,
    默认值是类名称,首字母小写,如 UserService – userService,该名称就是创建的对象的名称。

  3. 基于注解方式创建对象:
    步骤:
    (1)引入 spring-aop.jar 包。
    (2)在配置文件中引入 context 名称空间,使用<context:component-scan base-package=""></context:component-scan>标签,开启组件扫描,其中 base-package 属性表示要扫描的包路径。
    开启组件扫描:spring 在指定的包下查找用于创建对象的注解,若查找到,则创建对象。
    (3)创建类,在类的声明上面,添加注解,用于创建对象。

Spring 配置文件 annotation1.xml

<?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">
	<!--
		开启组件扫描:
		1.如果扫描多个包,使用逗号隔开
		2.扫描包的上层目录
	-->
	<context:component-scan base-package="com.mcc.spring5.annotation"></context:component-scan>
	
</beans>

UserService.java

package com.mcc.spring5.annotation;

import org.springframework.stereotype.Component;
/*
	注解内的 value 属性值可以省略不写,
	默认值是类名称,首字母小写,
	如 UserService -- userService
*/
@Component(value="userService")
public class UserService {
	public void show() {
		System.out.println("UserService show");
	}
}

测试

@Test
public void testUserService() {
	ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("annotation1.xml");
	UserService userService = context.getBean("userService", UserService.class);
	System.out.println(userService);
	userService.show();
	context.close();
}

开启组件扫描的配置

开启组件扫描:spring 在指定的包下查找用于创建对象的注解,若查找到,则创建对象。

Spring 在搜索指定包内的带注解的类时,使用默认的 Filter,默认 Filter 会搜索全部带注解的类。

  • use-default-filters=“false”:表示不使用默认 Filter,而是使用新配置的 Filter 进行扫描
  • <context:include-filter>设置扫描哪些内容type 属性表示根据何种类型进行扫描,expressions 属性表示扫描满足何种条件的类
  • <context:exclude-filter>设置不扫锚哪些内容
<?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">
	
	<!-- 
		Spring 在搜索指定包内的带注解的类时,使用默认的 Filter,默认 Filter 会搜索全部带注解的类
		use-default-filters="false" 表示不使用默认 Filter,而是使用新配置的 Filter
 		context:include-filter,设置扫描哪些内容,type 属性表示根据何种类型进行扫描,expressions 属性表示扫描满足何种条件的类
 		context:exclude-filter,设置不扫锚哪些内容
	 -->
	 <!-- 表示根据注解进行扫描,扫描注解为 org.springframework.stereotype.Controller 的类 -->
	<context:component-scan base-package="com.mcc.spring5.annotation" use-default-filters="false">
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	</context:component-scan>
	
	<!-- 表示根据注解进行扫描,不扫描注解为 org.springframework.stereotype.Service 的类 -->
	<context:component-scan base-package="com.mcc.spring5.annotation">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
	</context:component-scan>
</beans>

注入属性

Spring 提供的进行属性注入的注解有:
(1)@Autowired:根据属性类型进行自动装配
(2)@Qualifier:根据名称进行注入,要与 @Autowired 组合使用 @Qualifier(value="")
(3)@Resource:可以根据类型注入,也可以根据名称注入 @Resource(name="")
(4)@Value:注入普通类型属性 @Value(value="")

  1. @Autowired

UserDaoImpl.java

package com.mcc.spring5.annotation;

import org.springframework.stereotype.Component;

@Component//创建UserService对象
public class UserDaoImpl implements UserDao{
	@Override
	public String toString() {
		return "UserDaoImpl []";
	}
}

UserService.java

package com.mcc.spring5.annotation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

//创建对象
@Component(value="userService")
public class UserService {
	//注入属性
	@Autowired//自动装入UserDao类型的对象
	private UserDao userDao;
	
	public void show() {
		System.out.println(userDao.toString());
	}

	@Override
	public String toString() {
		return "UserService [userDao=" + userDao + "]";
	}
	
}
  1. @Qualifier

UserService.java

package com.mcc.spring5.annotation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

//创建对象
@Component(value="userService")
public class UserService {
	//注入属性
	@Autowired
	@Qualifier(value="userDaoImpl")//注入类型为UserDao,并且名称为userDaoImpl的对象
	private UserDao userDao;
	
	public void show() {
		System.out.println(userDao.toString());
	}

	@Override
	public String toString() {
		return "UserService [userDao=" + userDao + "]";
	}
	
}
  1. @Resource
package com.mcc.spring5.annotation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

//创建对象
@Component(value="userService")
public class UserService {
	//注入属性
	//@Resource
	@Resource(name="userDaoImpl")
	private UserDao userDao;
	
	public void show() {
		System.out.println(userDao.toString());
	}

	@Override
	public String toString() {
		return "UserService [userDao=" + userDao + "]";
	}
	
}
  1. @Value
package com.mcc.spring5.annotation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

//创建对象
@Component(value="userService")
public class UserService {
	//注入属性
	@Autowired
	@Qualifier(value="userDaoImpl")
	private UserDao userDao;
	
	@Value(value="user")
	private String name;
	
	public void show() {
		System.out.println(userDao.toString());
	}

	@Override
	public String toString() {
		return "UserService [userDao=" + userDao + ", name=" + name + "]";
	}
	
}

完全注解开发

创建一个配置类,代替 xml 配置文件,实现完全注解开发模式。

实现方式:
(1)在类上使用注解 @Configuration 实现配置类。
(2)继续在该类上使用注解 @ComponentScan(basePackages={"",""}) 开启组件扫描。
(3)在测试类中,使用 AnnotationConfigApplicationContext(Class clazz) 加载配置类。

SpringConfig.java

package com.mcc.spring5.annotation;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration//声明该类为Spring配置类
@ComponentScan(basePackages = {"com.mcc.spring5.annotation"})//开启组件扫描
public class SpringConfig {

}

测试类

@Test
public void testSpringConfig() {
	AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
	UserService userService = context.getBean("userService", UserService.class);
	System.out.println(userService);
	userService.show();
	context.close();
}

UserDaoImpl.java

package com.mcc.spring5.annotation;

import org.springframework.stereotype.Component;

@Component(value="userDaoImpl")
public class UserDaoImpl implements UserDao{

	@Override
	public String toString() {
		return "UserDaoImpl []";
	}

}

UserService.java

package com.mcc.spring5.annotation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

//创建对象
@Component(value="userService")
public class UserService {
	//注入属性
	@Autowired
	@Qualifier(value="userDaoImpl")
	private UserDao userDao;
	
	@Value(value="user")
	private String name;
	
	public void show() {
		System.out.println(userDao.toString());
	}

	@Override
	public String toString() {
		return "UserService [userDao=" + userDao + ", name=" + name + "]";
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值