目录
1.Bean基本注解开发
@Component
@Score@lazy
@PostConstruct和@PreDestroy
@Repository@Service@Controller
2.Bean依赖注入注解开发
@Value
@Autowired
@Qualifier
@Resource
扩展AutoWired
1.Bean基本注解开发
基本Bean注解,主要是使用注释的方式替代原有xml的
<bean>
标签及其标签属性的配置<bean id=" " name="" class="" scope="" lazy-init="" init-method="" destroy-method="" abstract="" autowire="" factory-bean="" factory-method=""></bean>
@Component
使用注解替代
<bean>
标签//Component注解 必须写类上面 可以起别名(没有起别名默认类名小写)
被该注解标识的类,会在指定扫描范围内被spring加载并实例化
使用步骤1,更改配置文件的头添加注解 2.添加扫描
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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 "> <!--spring需要通过注解的方式将类放到spring容器中 需要配置一个标签 context 告诉spring容器去哪里扫描注解--> <!-- 告诉spring容器将那个包下具有注解的类放置spring容器中--> <context:component-scan base-package="com.rocky"></context:component-scan> </beans>
@Component("user") public class User { private Integer id; private String uname; private String password; }
@Score@lazy
@PostConstruct和@PreDestroy
<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api --> 需要引入依赖 <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency>
@PostConstruct public void init(){ System.out.println("init User"); } @PreDestroy public void destroy(){ System.out.println("destroy user"); }
@Repository@Service@Controller
由于JavaEE开发是分层的,为了每层Bean标识的注解语义化更加明确,@Component又衍生出如下三个注解:
2.Bean依赖注入注解开发
Bean依赖注入的注解,主要是使用注解的方式替代XML的
<property>
标签完成属性的注入操作<bean id="" class=""> <property name="" value=""></property> <property name="" ref=""></property> </bean>
@Value
@Component public class User { @Value(value = "zhangsan") private String name; @Value("20") private int age; @Value("李四") public void setName(String name) { this.name = name; } public User(@Value("隔壁老王") String name, @Value("33") int age) { this.name = name; this.age = age; }
@Value注解可以出现在属性上、setter方法上、以及构造方法的形参上
@Autowired
Autowired注解可以用来注入非简单类型。单独使用@Autowired注解,默认根据类型装配。
@Autowired根据类型注入
//如果有多个实现了接口的对象,那么我们必须和bean的参数名称匹配
//传递的参数和bean名称(id一致)@Autowired // 在属性上注入 private UserDao userDao; @Autowired public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Autowired public UserService(UserDao userDao) { this.userDao = userDao; } public UserService(@Autowired UserDao userDao) { this.userDao = userDao; }
@Qualifier
@Autowired注解默认是byType进行注入的,也就是说根据类型注入的,如果以上程序中,UserDao接口还有另外一个实现类,会出现问题
/Qualifier 指的是将spring容器中的名字匹配到方法参数中,和方法参数的名称无关
//必须和autowired组合使用byName,根据名称进行装配了。@Autowired注解和@Qualifier注解联合起来才可以根据名称进行装配,在@Qualifier注解中指定Bean名称。
@Autowired() @Qualifier("mysqlDao") //类没有指定别名时 使用类名 首字母小写 public void setUserDao( UserDao userDao) { this.userDao = userDao; }
@Resource
- 相当于@Autowired 和 @Qualifier
- @Resource注解默认根据名称装配byName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。
- @Resource注解用在属性上、setter方法上。
- //不指定参数名称时,等同于autowired
@Resource(name = "oracle")
扩展AutoWired
任何方法都可以根据AutoWired注入
// Autowired还可以给普通方法传递参数 @Autowired @Qualifier("bbb") public void hahha(UserDao userDao){ } @Autowired public void xixixix(List<User> users){ }