IOC操作—Bean管理
基于注解实现
创建对象
-
什么是注解?
(1)注解是代码的特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值…)
(2)注解的使用:注解作用在类上面,方法上面,属性上面
(3)使用注解目的:简化 xml 配置 -
Spring 针对 Bean 管理,提供如下注解,用于创建对象:
(1)@Component
(2)@Repository,常用于 DAO 层
(3)@Service,常用于 service 层
(4)@Controller,常用于 web 控制层
注意,上面四个注解的功能是一样的,都可以用来创建 bean 实例,注解内的 value 属性值可以省略不写,
默认值是类名称,首字母小写,如 UserService – userService,该名称就是创建的对象的名称。 -
基于注解方式创建对象:
步骤:
(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="")
- @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 + "]";
}
}
- @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 + "]";
}
}
- @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 + "]";
}
}
- @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 + "]";
}
}