1、注解是什么?
- 注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值...)
- 注解可以标记类、方法、属性
- 注解的目的是为了简化xml配置
2、创建对象
- 针对Bean管理创建对象Spring提供了四个注解
1、@Component(通用)
2、@Service(用于逻辑层)
3、@Controller(用于web层)
4、@Repository(用于DAO层)
上述注解名称功能相同,只是为了区分类的功能
- 实现创建对象
1、引入Spring-aop的依赖jar包
2、在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">
<!-- 引入context名称空间,开启组件扫描 -->
<context:component-scan base-package="com.spring.annotation"></context:component-scan>
</beans>
3、创建类,在类上面添加注解
@Component(value = "user") // 等同于<bean id="user" class="..."></bean>
public class User {
public void say() {
System.out.println("hello everyone...");
}
}
- 开启组件扫描细节
1、配置指定扫描
<!--
1、use-default-filters属性指是否使用默认扫描规则,默认是扫描包下面所有类
2、include-filter标签设置扫描规则
3、下面扫描组件的意思只扫描com.spring.annotation包下面所有Controller注解的类
-->
<context:component-scan base-package="com.spring.annotation" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
2、忽略某些类
<!--
1、exclude-filter标签设置扫描规则
2、下面扫描组件的意思扫描com.spring.annotation包下面所有不是Controller注解的类
-->
<context:component-scan base-package="com.spring.annotation">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
3、属性赋值
- @Autowired
Autowired注解是根据属性类型进行赋值,适用于对象类型属性;当属性类型为普通类时,将直接赋值该类的对象实例;当属性类型为接口类时,将找到接口的唯一实现类进行赋值,若接口存在多个实现类,需要配合@Qualifier注解一起使用
UserService.java
@Service(value = "userService")
public class UserService {
@Autowired
private UserDao userDao;
public void add() {
System.out.println("service add");
userDao.add();
}
}
UserDao.java
public interface UserDao {
void add();
}
UserDaoImpl.java
@Repository
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("dao add");
}
}
- @Qualifier
Qualifier注解适用于对象类型属性赋值,可根据名称直接赋值,需要配合Autowired一起使用;当属性指向某个接口类型时,可指定接口实现类进行赋值
UserService.java
@Service(value = "userService")
public class UserService {
@Autowired
@Qualifier(value = "userDaoImpl")
private UserDao userDao;
public void add() {
System.out.println("service add");
userDao.add();
}
}
UserDaoImpl.java
@Repository(value = "userDaoImpl")
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("dao add");
}
}
- @Resource
可根据类型或名称赋值,当注解后有value则使用名称赋值;不需要配合Autowired使用;该类不是Spring提供的,所以不推荐使用
- @Value
针对非对象类型属性赋值
@Service(value = "userService")
public class UserService {
@Autowired
@Qualifier(value = "userDaoImpl")
private UserDao userDao;
@Value(value = "test")
private String name;
public void add() {
System.out.println("service add" + name);
userDao.add();
}
}
4、初识完全注解开发
注解存在的意义是简化xml配置,完全注解开发就是使用注解配置类完全替代xml配置文件
- 创建注解配置类
@Configuration //声明为配置类,替代xml配置文件
//组件扫描注解,等同于<context:component-scan base-package="...">
@ComponentScan(basePackages = {"com.spring.annotation"})
public class AnnotationConfig {
}
- 加载配置
@Test
public void doTest() {
//加载xml文件配置
ApplicationContext appContext =
new ClassPathXmlApplicationContext("bean3.xml");
}
@Test
public void doTest2() {
//加载注解配置类
ApplicationContext appContext =
new AnnotationConfigApplicationContext(AnnotationConfig.class);
}