1.Spring框架创建
- 创建一个maven项目
- 添加Spring框架支持
<dependencies> 上下文<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></dependency> Bean对象<dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.3.RELEASE</version></dependency></dependencies>
- 创建普通类和main方法来运行spring框架
2.存储Bean对象
- 创建Bean对象
- 将创建的bean注册到spring当中(在xml里面进行实现的)
- 在resources里面配置⽂件 spring-config.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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"></beans>
- 在配置文件里面去把Bean注册到spring里面
3.获取Bean对象
- 对象交给Spring去管理,先得到Spring上下文对象
- 通过ApplicationContext来获取Spring上下文
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
2.通过BeanFactoryContext来获取Spring上下文
BeanFactory context=new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
面试题:ApplicationContext和BeanFactoryde的区别?相同:都可以得到Spring上下文对象;都来自Spring顶级接口不同:继承关系和功能⽅⾯来说: ApplicationContext属于 BeanFactory 的⼦类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持。从性能⽅⾯来说:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,⽽BeanFactory 是需要那个才去加载那个,因此更加轻量。
- 通过Spring上下文,获取某一个指定的Bean对象
User user = (User) context.getBean("user"); 这里的id需要与配置文件的id对应
根据类型来获取Bean对象User user=context.getBean(User.class);
当有⼀个类型被重复注册到 spring-config.xml 中时,只能使⽤根据名称获取了
根据创建的Bean名称和类型来获取 User user=context.getBean("user",User.class);
- 使用Bean对象
public class App {public static void main(String[] args) {//得到Spring对象上下文//ApplicationContext context=new ClassPathXmlApplicationContext("spring-config");BeanFactory context=new XmlBeanFactory(new ClassPathResource("spring-config.xml"));//加载某个Bean对象User user = (User) context.getBean("user");//使用Bean对象(可选)System.out.println(user.sayhi());}}
4.Spring更简单的读和取
- 配置扫描路径,只有被配置的包下的所有类,添加了注解才能被保存在Spring中
<?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:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><content:component-scan base-package="com.bit.service"></content:component-scan> </beans> 扫描的根路径
- 注意:如果没有设置包,所有的类都写在java根路径下,需要使用**来扫描本目录路径
<content:component-scan base-package="**"></content:component-scan> 扫描的根路径
- 添加注解存储Bean对象
1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration。 2. ⽅法注解:@Bean
- @controller控制器
- @Service服务存储
- @Repository 仓库存储
- @Component组件存储
- @Configuration配置存储
这些注解⾥⾯都有⼀个注解 @Component,本身就是属于 @Component 的“⼦类”
5.Bean的读取
通常我们 bean 使⽤的都是标准的⼤驼峰命名,⽽读取的时候⾸字⺟⼩ 写就可以获取到 bean
- 注意:
- 当Bean对象的类名首字母小写,和首字母大写获取方式一样,类名首字母小写
- 当Bean对象的类名的第一个和第二个字母都大写,使用原类名
6.5大注解有什么关系?为什么需要5个类注解?(面试)
- @Controller(控制器):归属于业务逻辑,用来控制用户的行为,它用来检查用户参数有效性
- @Service(服务层):归属于服务层,调用持久化类来实现相应的功能,不是直接和数据库交互,类似于控制中心
- @Repository(仓库):归属于持久层,直接和数据库交互,每个表都会对应一个Repository
- @Configuration(配置层):用来配置当前项目一些信息
- @Component(组件):归属于公共工具类,提供某些公共方法
这些注解⾥⾯都有⼀个注解 @Component,本身就是属于 @Component 的“⼦类”
7.方法注解Bean
- 重命名Bean(支持设置name属性,因为方法名是可以重复的,可能会导致获取的Bean对象不知道是哪个)给Bean设置name属性,原方法名就不可以在使用
8.更简单的获取Bean对象 (3种方式)
- 属性注入
优点:实现简单
缺点:无法注入一个不可变对象;只是用于IOC容器;更容易违背单一设计原则
- 构造方法注入(当类里面只有一个构造方法,AutoWired也可以省略)
- 构造方法注入(使用@Resource关键词)
@Autowired和@Resource区别:出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean。@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注 ⼊和属性注⼊,不能⽤于构造函数注⼊。
优点:可以注入不可变对象;注入的对象不会被修改(加上final)构造方法在类加载时只执行一次;注入对象被完全初始化;通用性更好
缺点:没有属性注入简单
- Setter注入(从Spring里面取对象)
优点:更符合单一设计原则,只针对一个属性;写法比属性注入复杂,更符合单一设计原则
缺点:不能注入不可变对象;注入的对象可以被修改(set方法是普通方法,可被重复调用,调用时存在修改风险)
9.同⼀类型多个 @Bean 报错
- 方法1:使⽤ @Resource(name="XXX")
- 方法2:使⽤ @Qualifier 注解定义名称