1、什么是注解
(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值,…)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的,简化xml配置
2、Spring针对Bean管理中创建对象提供注释
(1)@Component
:标注一个普通的Spring Bean类
(2)@Service
:标注一个控制器组件类
(3)@Controller
:标注一个业务逻辑组件类
(4)@Repository
:标注一个DAO组件类
上述四个注解功能是一样的,都可以用来创建bean实例
3、基于注解方式实现对象创建
(1)引入依赖
(2)开启组件扫描
这一步就是告知Spring容器当前需要在哪个类里面加上注解
(3)引入名称空间context
如果扫面多个包,可以逗号隔开
<!--组件扫描,指明扫描哪个包中的哪个类中,看是否有注解-->
<context:component-scan base-package="service,dao,springDemo3"></context:component-scan>
(4)创建类,在类上面添加创建对象注释
UserService
package service;
import org.springframework.stereotype.Component;
@Component(value = "userService1")
//在注解里面value如果不写,那么默认值就是类名称,同时首字母小写
//eg: UserService---userService
public class UserService {
public void add()
{
System.out.println("service add....");
}
}
4、开启组件扫描细节配置
(1)设置扫描的指定内容
<context:component-scan base-package="dao" use-default filters="false">
<use-default filters="false" type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
use-default filters="false"
,加了这一句,就不会扫描指定包中的所有内容,而是自己定义规则
use-default filters="false"
,设置扫描哪些内容
expression="org.springframework.stereotype.Controller
,只扫描注解是Controller
的内容
(2)设置不扫描的指定内容
<context:component-scan base-package="com.atguigu">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
context:exclude-filter
,这里是exclude
,因此是不包含,上述语句就是不扫描注解是Controller
的语句
5、基于注解方式实现属性注入
(1)@Autowired
:根据属性类型进行自动装配
(2)@Qualifier
:根据属性名称进行注入
(3)@Resource
:可以根据类型注入,可以根据名称注入
(4)@Value
:注入普通类型属性
(1)(2)(3)是注入对象类型
(4)是普通类型
示例1
dao包中有UserDao接口,UserDaoImpl类
UserDao接口
package dao;
public interface UserDao {
public void add();
}
UserDaoImpl类
package dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl implements UserDao {
public void add()
{
System.out.println("UserDaoImpl add...");
}
}
在UserDao接口的实现类UserDaoImpl添加了@Repository
service包中有UserDaoImpl类
package service;
import dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
@Component(value="userService1")
@Service
//在注解里面value如果不写,那么默认值就是类名称,同时首字母小写
//eg: UserService---userService
public class UserService {
@Autowired
private UserDao userDao;
public void add()
{
System.out.println("service add....");
userDao.add();
}
}
在Service中添加了注解@Service
,@Autowired
示例2:
由于一个接口可以有多个实现类,假如进行多个UserDao的实现类还使用Autowired进行类型注入的话,就导致不知道是该注入哪个类型,因此需要根据名称进行注入,使用@Qualifier 注解
,@Qualifier 注解
的使用,和上面@Autowired
一起使用
在示例1的基础上进行修改,在实现类UserDaoImpl
的注解@Repository
,在其后面指定名称user1
然后在类UserService
中的@Autowired
下面添加@Qualifier(value = "user1")
示例3
@Resource:可以根据类型注入,可以根据名称注入
//@Resource //根据类型进行注入
@Resource(name = "userDaoImpl1") //根据名称进行注入
private UserDao userDao;
示例4
@Value:注入普通类型属性
@Value(value = "abc")
private String name;
6、完全注解开发
@Configuration
: 把当前类作为配置类,替代xml配置文件
springConfig类
package config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration //把当前类作为配置类,替代xml配置文件
@ComponentScan(basePackageClasses = {"SpringDemo3"}) //替代配置文件中的<context:component-scan base-package="SpringDemo3"></context:component-scan>
public class springConfig {
}
测试类
package testDemo;
import config.springConfig;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.UserService;
public class testConfig {
@Test
public void testService(){
//使用配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
UserService userService = context.getBean("userService",UserService.class);
System.out.println(userService);
userService.add();
}
@Test
public void testService2(){
// 加载配置类
ApplicationContext context = new AnnotationConfigApplicationContext(springConfig.class);
UserService userService = context.getBean("userService",UserService.class);
System.out.println(userService);
userService.add();
}
}