注解Annotation
注解是代码中的一种特殊标记,java中的格式为@Anno_Name(pro=value)
注解可以被使用在方法,类和属性上;在spring中,使用注解来实现自动装配,可以简化Bean的配置,基本步骤如下:
- 引入依赖
- 开启组件扫描
- 使用注解定义Bean
- 注入依赖
引入依赖
在新建的spring项目下的src/main/resources路径下,创建bean配置文件和其他依赖配置文件
开启组件扫描
spring默认不开启注解方式, 需要额外开启功能 -- 在Beans标签里,加入
xmlns: context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://springframework.org/schema/context/spring-context.xsd"
然后开启功能,注意这里base-package的值是需要扫描的包名称,当这个包里存在有特定注解的方法/类/属性时,spring框架会自动扫描并装载至容器中
<context:component-scan base-package="com.example"></context:component-scan>
比如我在src/main/java下建立一个包com.example.demo,并在这个包里创建了一些有注解的类以及属性,那么spring会查找到这些内容并自动加载
排除某些组件
context : exclude-filter
标签,制定排除规则
type
设置排除或包含的依据
type: annotation
根据注解排除,expression中标明排除的注解的全类名
type: assignable
根据类型排除,expression中标明排除的类型的全类名
仅扫描指定组件
context : include-filter
标签,在原有的扫描规则上添加规则
use-default-filter
设为false关闭默认筛选,默认是包下所有的类
type
设置排除或包含的依据
type: annotation
根据注解排除,expression中标明排除的注解的全类名
type: assignable
根据类型排除,expression中标明排除的类型的全类名
使用注解定义
java提供了四种注解,spring可以根据这些注解将他们变成对应的Bean
注释 | 说明 |
---|---|
@Component | 用于描述spring的Bean,是一个广泛的概念,可以用在任何层次上,仅仅表示容器里的一个组件 |
@Repository | 用于数据访问层Dao,作用与@Component相同 |
@Service | 用于业务层Service,作用与@Component相同 |
@Controller | 用于控制层,作用与@Component相同 |
实例演示
在我们之前创建的包com.example.demo下新建一个类User
// 相当于在xml里定义<bean id="user" class="...">
@Component(value="user")
public class User() {...}
// 接下来我们可以新建一个测试类,还是按照之前的方法返回Bean对象,但是这一次我们不需要在xml里定义Bean了
⚠️ 注解要加在类或实现类上,接口不需要
注入依赖
@Autowired
@Autowired可以写在构造方法,方法,形参,属性和注解之前;默认情况下Bean对象应当已经被创建
属性注入
使用@Autowired完成属性注入,对应对象会根据类型自动找到对象,完成注入
// 假设我现在有一个UserService类和一个UserDao类
// 并且在UserDao中存在方法publish, 会打印一个字符串
@Service // 这个是创建Bean对象
public class UserServiceImpl implements UserService {
@Autowired // 这个是根据类型找到注入的对象属性
private UserDao ud;
// 类方法,引用其他类的publish方法
public void publish() {
System.out.println("service ===>");
ud.publish();
}
}
setter注入
同样的代码里,添加一个set方法
@Service
public class UserServiceImpl implements UserService {
private UserDao ud;
@Autowired
public void setUserDao(userDao ud) {
this.ud = ud;
}
// publish(...)
}
构造方法注入
也可以在构造方法里注入
@Service
public class UserServiceImpl implements UserService {
private userDao ud;
@Autowired
public userServiceImpl(userDao ud) {
this.ud = ud;
}
//publish(...)
}
以及,形参注入
@Service
public class UserServiceImpl implements UserService {
private userDao ud;
public userServiceImpl(@Autowired userDao ud) {
this.ud = ud;
}
// publish(...)
}
还有其他使用场景。。。
只有一个构造函数,且该函数需要传入参数
例如上面的UserServiceImpl构造函数里只传入了一个参数对象,这时候可以不写注解
@Autowired + @Qualifier
单独的autowired注解是根据类型来注入,加入qualifier实现根据名称注入,适用于拥有复数实现类的类
假设userDao类有两个实现类 -- userDaoImpl & userDaoImplll, 而我们需要注入userDaoImplll类
@Service // 这个是创建Bean对象
public class UserServiceImpl implements UserService {
@Autowired // 这个是根据类型找到注入的对象属性
@Qualifier(value = "userDaoImplll") // 注入了特定的实现类
private UserDao ud;
// 类方法,引用其他类的publish方法
public void publish() {
System.out.println("service ===>");
ud.publish();
}
}
@Resource
通过resource注解也可以完成注入,和autowired注解存在以下不同
- @Resource属于jdk扩展包,需要由外部引入(特定java版本),可以说是标准注解;而@Autowired来自spring框架
- resource默认根据名称注入,若名称未指定,则使用属性名,再不行就根据类型
- resource可以用于属性与setter
根据名称注入
@Controller(value="MyUserController") // 指定名称
public class UserControllerImpl implements UserController {...}
// 准备注入
@Service
public class UserServiceImpl implements UserService {
@Resource(name="MyUserController")
private UserController uc;
根据属性注入
@Controller(value="MyUserController") // 指定名称
public class UserControllerImpl implements UserController {...}
// 准备注入
@Service
public class UserServiceImpl implements UserService {
@Resource // 不指定名称, 注意下面的属性名称
private UserController MyUserController;
根据类型注入
就是不指定名称(resource注解后为空);以及属性名称也不一样,那么resource会根据类型去寻找对应的类,注入对象
全注解开发
省去spring的xml配置文件,使用配置类来替代
标签:spring,笔记,publish,注解,ud,public,注入 From: https://www.cnblogs.com/Akira300000/p/18002291