IOC
操作Bean
管理(基于注解方式)
总结: 注解注入属性的方式不用提供setter
方法
什么是注解
- 注解是代码特殊标记,格式是:
@注解名称(属性名称=属性值,属性名称=属性值...)
- 使用注解,注解作用在类上面,方法上面,属性上面
- 使用注解目的,简化
xml
配置
Spring
针对Bend
管理中创建对象提供四个注解【非常重要】
@Component
:可以作用在任何层中@Service
:作用于@service
层@Controller
:作用于Controller
层@Repository
:作用于Dao
层
上面四个注解功能是一样的,都可以用来创建bean
实例
基于注解方式实现对象创建
步骤:
- 导入
jar
依赖spring-aop
包 - 开启组件扫描
- 创建类,在类上添加创建对象注解
开启组件扫描:配置
开启组件扫描需要添加: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`属性
<!--
3.使用命名空间:开启注解扫描
方式一:"com.haikang.dao,com.haikang.service" 多个包之间用`逗号`隔开
方式二:扫描包上层目录: com.haikang
-->
<!-- <context:component-scan base-package="com.haikang.dao,com.haikang.service"/>-->
<context:component-scan base-package="com.haikang"/>
案例:
UserService
package com.haikang.service;
import org.springframework.stereotype.Service;
/**
* @Author 海康
* @Version 1.0
*/
@Service(value = "userService")//相当于:<bean id="userService" class="全路径"
/**
* 注意:value可以省略不定
* 默认是类名称,首字母变小写
* UserService --> userService
*/
public class UserService {
public void service(){
System.out.println("service......");
}
}
xml
文件【重要】
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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.导入jar包是: spring-aop包
2.引入命名空间:context
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
3.使用命名空间:开启注解扫描
-->
<!--
3.使用命名空间:开启注解扫描
方式一:"com.haikang.dao,com.haikang.service" 多个包之间用`逗号`隔开
方式二:扫描包上层目录: com.haikang
-->
<!-- <context:component-scan base-package="com.haikang.dao,com.haikang.service"/>-->
<context:component-scan base-package="com.haikang"/>
</beans>
test
类
@Test
public void test(){
ApplicationContext context =
new ClassPathXmlApplicationContext("bean1.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.service();
}
注解扫描的细节
<!--
use-default-filters:
默认是true,表示扫描base-package="com.haikang"下包类
设置false,表示不扫描,需要我们设置扫描才会扫描
context:include-filter:
表示只扫描type="annotation"包含: `@Controller`注解的类
-->
<context:component-scan base-package="com.haikang" use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--
context:exclude-filter
表示 `不` 扫描type="annotation"包含:`@Controller`注解的类
-->
<context:component-scan base-package="com.haikang">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
基于注解方式实现属性注入
对象类型注入三个注解【注意只对对象类型注入】
-
@Autowired
:根据属性类型进行自动装配 -
@Qualifier
:根据名称进行注入注意是:
@Qualifier
注解必须要和@Autowired
一起使用 -
@Resource
:可以根据类型注入,也可以根据名称注入【注意不是spring
中的注解,是javax
扩展包注解】
@Autowired
注解
案例:
在`UserService类中使用到`dao`层的UserDao中的方法
步骤:
- 把
UserService
类和UserDao
接口及子类创建,并在UserService
类和UserDao
子类中注解相应注解 - 在
UserService
注入UserDao
对象,在UserService
类添加UserDao
类型属性,在属性上面使用注解
UserDao
接口
public interface UserDao {
public void dao();
}
UserDaoImpl
实现类
@Repository
public class UserDaoImpl implements UserDao{
@Override
public void dao() {
System.out.println("userDao......");
}
}
UserService
类
@Service(value = "userService")//相当于:<bean id="userService" class="全路径"
/**
* 注意:value可以省略不定
* 默认是类名称,首字母变小写
* UserService --> userService
*/
public class UserService {
使用注解注入对象属性
@Autowired
private UserDao userDao;
public void service(){
System.out.println("service......");
userDao.dao();
}
}
test
类
@Test
public void test(){
ApplicationContext context =
new ClassPathXmlApplicationContext("bean1.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.service();
}
@Qualifler
注解
使用@Qualifler
注解必须与@Atuowired
注解一起使用
使用场景,当一个接口中有多个实现类,一个类中有多个子类,就可以使用Qualifler
注解指定是用那个类
进行注入
UserDaoImpl
类
// 注解上的value可以省略,默认就是该类名,首字母变小写
// @Repository( value = "userDaoImpl")
// value可以省略
public class UserDaoImpl implements UserDao{
@Override
public void dao() {
System.out.println("userDao......");
}
}
UserService
类
public class UserService {
@Autowired
@Qualifier("userDaoImpl")
private UserDao userDao;
public void service(){
System.out.println("service......");
userDao.dao();
}
}
@Resource
注解
可以根据类型注入,也可以根据名称注入
注意是:@Resource
不是Spring
中的注解,是javax
包的注解
UserDaoImpl
类
// 注解上的value可以省略,默认就是该类名,首字母变小写
@Repository( value = "userDaoImpl")
// value可以省略
public class UserDaoImpl implements UserDao{
@Override
public void dao() {
System.out.println("userDao......");
}
}
UserService
类
@Service(value = "userService")//相当于:<bean id="userService" class="全路径"
/**
* 注意:value可以省略不定
* 默认是类名称,首字母变小写
* UserService --> userService
*/
public class UserService {
//@Resource// 表示根据类型进行注入
@Resource(name = "userDaoImpl")
private UserDao userDao;
public void service(){
System.out.println("service......");
userDao.dao();
}
}
普通属性注入@value
注解
@Service(value = "userService")//相当于:<bean id="userService" class="全路径"
/**
* 注意:value可以省略不定
* 默认是类名称,首字母变小写
* UserService --> userService
*/
public class UserService {
@Value("海康")
private String name;
//@Resource// 表示根据类型进行注入
@Resource(name = "userDaoImpl")
private UserDao userDao;
public void service(){
System.out.println("service......"+name);
userDao.dao();
}
}
报错:1. No bean named 'userDaoImfpl' available
表示该bean
没有找到,2.No qualifying bean of type 'com.haikang.dao.UserDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:
表示该接口至少需要一个实现类
完全注解开发【重点】
使用步骤:
-
创建配置类,替代
xml
配置文件在配置类中需要使用到两个注解 1.`@Configuration //表示作为配置类,替代xml配置文件 2.`@ComponentScan(baswPackages = {"需要扫描的包"})`
-
编写测试类
配置类:
/**
* @Author 海康
* @Version 1.0
*/
@Configuration
@ComponentScan(basePackages = {"com.haikang"})//表示扫描`haikang下所有类`
public class MyConfig {
}
编写测试类:
@Test
public void test2(){
ApplicationContext context =
new AnnotationConfigApplicationContext(MyConfig.class);
UserService userService = context.getBean("userService", UserService.class);
userService.service();
}
注意是: AnnotationConfigApplicationContext(Class<T> class)
,传入配置类的类字节码
总结: 注解注入属性的方式不用提供setter
方法