【Java EE】----Spring框架创建和使用

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里面进行实现的)
  1. 在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>
  2. 在配置文件里面去把Bean注册到spring里面

3.获取Bean对象

  • 对象交给Spring去管理,先得到Spring上下文对象
  1. 通过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
  1. @controller控制器

  1. @Service服务存储

  1. @Repository 仓库存储

  1. @Component组件存储

  1. @Configuration配置存储

这些注解⾥⾯都有⼀个注解 @Component,本身就是属于 @Component 的"⼦类"

5.Bean的读取

通常我们 bean 使⽤的都是标准的⼤驼峰命名,⽽读取的时候⾸字⺟⼩ 写就可以获取到 bean

  • 注意:
  1. 当Bean对象的类名首字母小写,和首字母大写获取方式一样,类名首字母小写
  2. 当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 注解定义名称
相关推荐
吾日三省吾码5 分钟前
JVM 性能调优
java
弗拉唐1 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi772 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
少说多做3432 小时前
Android 不同情况下使用 runOnUiThread
android·java
知兀2 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
蓝黑20202 小时前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea
Ysjt | 深2 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
shuangrenlong3 小时前
slice介绍slice查看器
java·ubuntu
牧竹子3 小时前
对原jar包解压后修改原class文件后重新打包为jar
java·jar