Spring
1、关于Bean的自动装配
自动装配是Spring满足bean依赖注入的一种方式,Spring会根据上下文自动给bean装配属性
三种装配方式:
- xml中显示的配置
- java中显示的配置
- 隐式的自动装配
1. byName自动装配
<!-- byName:会自动在容器中的上下文查找和自己对象set方法后面的值对应的beanID --> <bean id="people" class="com.charles.dao.People" autowire="byName"> <property name="name" value="Charles"/> </bean>
2.byType自动装配
<!-- byType:会自动在容器中的上下文查找和自己对象属性类型相同的bean(要保证该类型全局唯一) --> <bean id="people" class="com.charles.dao.People" autowire="byType"> <property name="name" value="Charles"/> </bean>
3.注解进行装配
使用前需要导入context约束
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> </beans>
@Autowired (前提条件:你的自动装配属性在IOC容器中存在,且符合名字(默认是byName))
直接在属性上使用即可(使用后,可以忽略setter方法),当然也可以在setter方法上使用
如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解去实现,我们可以使用@Qualifier(value = "xxx") 去配置@Autowired的使用,指定一个唯一的bean对象注入
@Autowired private Cat cat; @Autowired
@Qualifier(value = "dog") private Dao dao; private String name;
@Resource
@Resource 是一个组合注解,先从名字查找,后从属性查找,但凡有一个是对的即可,当两个都不可以的时候,我们可以给他加一个@Resource(name="xxx")
@Resource private Cat cat; @Resource(name = "dog") private Dao dao;
2、使用注解进行开发
注解开发大大减轻的代码量大的压力,但是难维护
使用前,需要导入context约束
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 开启注解的支持 --> <context:annotation-config/> <!-- 指定要扫描的包,这个包下的注解就会生效 --> <context:component-scan base-package="com.charles.dao"/> </beans>
1. bean
@Component:组件,放在类上,说明这个类被spring管理了,就是bean
// 等价于 <bean id="user" class="com.chalre.pojo.user"/> // @Component 组件 @Component public class User { public String name = "Charles"; }
2.注入属性
@Value():注入值, 相当于<property name="name" value="CHARLES"/>
@Value("CHARLES") public String name;
3.衍生注解
@Component 有几个衍生注解,我们在web开发中,会按照MVC三层架构分层
-
dao 【@Repository】
-
service 【@Service】
-
controller 【@Controller】
-
pojo 【@Component】
4.作用域
@Scope("xxx")
3、使用java的方式配置Spring
当然,不一定非要用xml的方式配置Spring,我们还可以利用Java的方式来配置Spring
例子
实体类
package com.charles.pojo; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class User { public String name; @Override public String toString() { return "User{" + "name='" + name + '\'' + '}'; } public String getName() { return name; } @Value("Charles") public void setName(String name) { this.name = name; } }
配置类
package com.charles.config; import com.charles.pojo.User; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; // 加了这个等同于 <beans></beans> // 这个也会被Spring容器托管注册到容器中,因为他里面含@Component @Configuration @ComponentScan("com.charles.pojo") public class CharlesConfig { // 注册一个bean,就相当于我们之前写的一个bean标签, // id = 这个方法的名字(getUser) // class = 方法的返回值(User) @Bean public User getUser(){ // 返回要注入到bean的对象 return new User(); } }
这种方式,一般在spring boot中使用。