前言:今天的课程较多,自主学习的时间就少了点,所以今天的笔记也就少了一些。虽然今天学习完基于注解管理注入Bean对象后还有比较早,今天就暂时到这儿吧,小小休息一下
1、什么是注解 (1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值..)
(2)使用注解,注解作用在类上面,方法上面,属性上面 (3)使用注解目的:简化 xml 配置
2、Spring 针对 Bean 管理中创建对象提供的注解 (1)@Component:Spring提供的一种普通注解,使用它也可以直接创建对象 (2)@Service:主要用于service(业务)层 (3)@Controller:主要用于web(表现)层 (4)@Repository:主要用于dao(持久)层 上面四个注解功能是一样的,都可以用来创建 bean 实例,没有特意指明哪个注解必须要用在什么层,只是方便开发时区分
//在注解里面 value 属性值可以省略不写
//默认值是类名称,首字母小写
//UserService -- userService,等同于xml配置方式中bean标签的id属性值
@Service(value = "userService") //等同于
public class UserService {
public void add(){
System.out.println("userService add......");
}
}
测试
@Test
public void testService(){
ApplicationContext context = new ClassPathXmlApplicationContext("beanCreate.xml");
UserService userService = context.getBean("userService", UserService.class);//其中的userService就是注解中value属性的值
System.out.println(userService);
userService.add();
//com.service.UserService@790a251b
//userService add......
//测试通过,输出了userService对象引用并且调用了方法说明通过注解创建对象成功
}
@Autowire
:根据属性类型进行自动装配
第一步 创建 service 和 dao 对象:在 service 和 dao 类添加创建对象注解(同时要在配置文件开启组件扫描确保这些类能被扫描到)
public interface UserDao {
public void add();
}
@Repository(value = "userDaoImpl1") //默认value = "userDaoImpl",这里设置value属性的值是为了解释使用@Qulifiler等其他注解的情况
public class UserDaoImpl implements UserDao {
@Override
public void add() {
System.out.println("userDaoImpl add......");
}
}
第二步 在 service 注入 dao 对象:在 service 类添加 dao 类型属性,在属性上面使用注解
@Service
public class UserService {
//定义 dao 类型属性
//不需要添加 set 方法
//添加注入属性注解
@Autowired //根据类型注入
private UserDao userDao;
public void add(){
System.out.println("userService add......");
userDao.add();
}
}
测试代码
@Test
public void testService(){
ApplicationContext context = new ClassPathXmlApplicationContext("beanCreate.xml");
UserService userService = context.getBean("userService", UserService.class);//其中的userService就是注解中value属性的值
System.out.println(userService);
userService.add();
//com.service.UserService@702b06fb
//userService add......
//userDaoImpl add......
}
@Qualifier
:根据名称进行注入,这个注解的使用需要和@Autowired
配合使用
//在下方类中使用@Autowired和@Qualifiler
@Service
public class UserService {
@Autowired //根据类型注入
@Qualifiler(value = "userDaoImpl1") //当value = "userDaoImpl1"时就可以找到UserDaoImpl类并将其作为对象属性进行注入,否则就会找不到需要注入的对象类导致无法创建userDao对象
private UserDao userDao;
public void add(){
System.out.println("userService add......");
userDao.add();
}
}
@Resource
:可以根据类型注入,可以根据名称注入
@Service
public class UserService {
//@Resource 根据类型进行注入
@Resource(value = "userDaoImpl1") //根据名称进行注入
private UserDao userDao;
public void add(){
System.out.println("userService add......");
userDao.add();
}
}
@Value
:注入普通类型属性
@Service
public class UserService {
@Value(value = "abc") //使用@Value注解给普通类型属性注入值
private String name;
public String getName(){
return name;
}
}
//给这个普通属性提供get方法后,就可在测试方法中通过userService对象得到这个name属性的值
创建配置类,替代 xml 配置文件(这种开发模式主要是在SpringBoot中使用)
@Configuration //标记该类为配置类,替代xml配置文件
@ComponentScan(basePackages = {"com"}) //表示开启组件扫描,需要扫描的类通过basePackages属性指定其上级目录
//另外,ComponentScan注解还有一个basePackageClasses属性,根据属性名可以知道是通过指定某些类的类名来标记其为被扫描对象;而basePackages是根据指定某些软件包的包名来标记其中的类能被扫描
public class SpringConfig {
}
测试代码
@Test
public void testService(){
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);//使用AnnotationConfigApplicationContext类加载配置类
UserService userService = context.getBean("userService", UserService.class);
System.out.println(userService);
userService.add();
System.out.println(userService.getName());
//com.service.UserService@475646d4
//userService add......
//userDaoImpl add......
//abc
}
学习完基于注解管理注入Bean对象后只能说一句“完全注解开发万岁!”,但是我相信到后面深入学习原理的时候就不会这样想了