Spring---使用注解装配Bean(三)
程序员文章站
2024-02-16 10:41:34
...
(一)基于Annotation的装配
1.为什么要使用Annotation的装配Bean?
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:
- 如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低。
- 在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率。
- Spring引入了注解,通过”@XXX”的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。同时提升了开发效率。
2.Spring中常用的注解
注解 | 说明 |
---|---|
@Component | 在Spring中使用@Component注解Bean,但@Component只代表一个组件(Bean),使用时只需要将该注解标注相应类上即可。 |
@ Repository | @Repository对应数据访问层(DAO),例如使用@Repository(value=”userDao”)注解是告诉Spring,让Spring创建一个名字叫”userDao”的UserDaoImpl实例,其功能和@Component一样。 |
@Service | @Service标注的是业务层逻辑处理类Bean,比如使用@Service(“userService”)注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做”userService”,其功能和@Component一样。 |
@Controller | @Controller用于标注在控制类(比如Spring MVC的Controller),比如使用@Controller注解标识UserController之后,就表示要把UserController交给Spring容器管理,在Spring容器中会存在一个名字为”userController”的Controller,这个名字是根据UserController类名来取的。注:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value=”UserController”)】或者【@Controller(“UserController”)】,则使用value作为bean的名字。其功能和@Component一样。 |
@Autowired | @Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。可以在 setter 方法中被用于自动连接bean |
@Resource | 功能与@Autowired一样,其区别在于@Autowired默认按照类型装配,而@Resource按照Bean实例名称进行装配。@Resource有两个属性:name和type,Spring将name解析为Bean的实例名,type解析为Bean实例类型。 @Resource的装配顺序:aaa@qq.com后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹。2.指定了name或者type则根据指定的类型去匹配bean。3,指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错。 |
@Qualifier | 如果容器中有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称,指定哪个真正的bean将会被装配,应用于一个接口有多个实现类的情况。 |
@RequestMapping | 在SpringMVC中的Controller类中标注@RequestMapping用于指定请求路径 |
@RequestBody | 返回json结果数据 |
(二)使用注解装配Bean实例演示
项目结构图
1.在com.wang.dao创建UserDao.java接口类
package com.wang.dao;
//创建用户接口
public interface UserDao {
public void delete();
}
2.在com.wang.daoImp创建UserDaoImp.java实现类
package com.wang.daoImp;
import org.springframework.stereotype.Repository;
import com.wang.dao.UserDao;
//创建用户实现类,当扫描到@Repository注解时,自动创建UserDaoImp对象
@Repository(value="userDaoImp")
public class UserDaoImp implements UserDao {
public void delete() {
System.out.println("delete User");
}
}
3.在com.wang.service创建UserService.java接口类
package com.wang.service;
//创建UserService接口
public interface UserService {
public void delete();
}
4.在com.wang.serviceImp创建UserServiceImp.java实现类
package com.wang.serviceImp;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.wang.daoImp.UserDaoImp;
import com.wang.service.UserService;
//自动创建 UserServiceImp实现类对象
@Service(value="userServiceImp")
public class UserServiceImp implements UserService {
//将创建名称为userDaoImp的UserDaoImp对象依赖注入到userDaoImp变量
@Resource(name="userDaoImp")
private UserDaoImp userDaoImp;
public void delete() {
userDaoImp.delete();
}
}
5.在com.wang.controller创建UserController.java类
package com.wang.controller;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import com.wang.service.UserService;
//使用@Controller自动创建 UserController对象
@Controller(value=" userController")
public class UserController {
@Resource(name="userServiceImp")
private UserService userService;
public void delete() {
userService.delete();
}
}
6.在src下创建spring.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-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!--因为使用注解,所以使用包扫描! -->
<context:component-scan base-package="com.wang.serviceImp,
com.wang.daoImp,
com.wang.controller"/>
</beans>
7.在com.wang.test包下创建TestDemo1.java测试类
package com.wang.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.wang.controller.UserController;
public class TestDemo1 {
public static void main(String[] args) {
@SuppressWarnings("resource")
ApplicationContext con=new
ClassPathXmlApplicationContext("spring.xml");
UserController userController= ( UserController)
con.getBean(" userController", UserController.class );
userController.delete();
}
}
上一篇: Java集合学习笔记
推荐阅读
-
Spring---使用注解装配Bean(三)
-
Spring in action 读书笔记(第二章)bean的装配(java类显式配置和spring-test单元测试的使用)
-
SpringBoot根据条件自动装配Bean(基于Condition接口和Conditional注解)
-
Android AOP 注解详解及简单使用实例(三)
-
Spring - 装配Bean 基于XML 及 注解
-
彻底搞明白Spring中的自动装配和Autowired注解的使用
-
Android AOP 注解详解及简单使用实例(三)
-
spring 装配bean的三种方式
-
Spring提供的三种装配Bean方式
-
Spring高级装配,Profile的使用,条件化Bean,解决歧义性