Spring 是开源组织, 提供了一套软件解决方法, 其中包括
- Spring Framework: Spring 框架
- SpringBoot Spring框架的启动器
- Spring WebMVC
- Spring Cloud 等
学习路径: Spring Framework -> SpringBoot -> SpringMVC
使用Spring可以大大简化java软件的开发.
Spring 框架, 有时候说的Spring就是特指Spring Framework.
Spring 框架, 是spring软件家族的核心, 提供了两大核心功能:
控制反转:将对象的创建管理工作交出去,在使用对象的时候直接拿到对象后直接使用。
软件中:
一般情况下简单对象使用主动控制方式创建管理对象
一般情况下复杂对象使用控制反转的方式创建管理对象,可以简化开发过程。
Spring 框架提供了IOC功能: 创建控制管理对象, 在软件需要使用的时候, 可以从Spring中获取这个对象。
1.创建maven项目导入spring框架核心包
2.声明一个JavaBean类
3.声明一个配置类, 在配置类中告诉Spring创建JavaBean对象
4.创建并初始化spring对象(构造器参数中填入配置类的类对象(例如:Context.class)),再启动spring, Spring会根据配置类, 自动创建管理的对象。
5.通过JavaBean类型或者类型和ID从Spring中获取创建好的JavaBean对象。
例如:Foo foo=getBean(Foo.class);
注意:
①需要定义包
②必须声明无参构造器,可以是默认构造器
③需要实现序列化接口Serializable
④使用getset方法访问属性
①需要定义包
②使用spring提供的注解 @Configuration 标注在spring的配置类上,表示当前类是一个配置类。
③类名无限制
①@Bean
* 是Spring提供的注解,表示在Spring中管理一个对象;
* 方法名无限制;
* 方法的返回值就是IoC创建的对象;
* Spring 启动的时候会自动调用该方法创建JavaBean类型的对象
* 在配置类中使用
②@ComponentScan("包名")
* 标注在配置类上,打开组件扫描功能,扫描参数的包和其子包中的类,如果类上标注了 @Component 注解,就会创建该类型的实例;
* @Component 注解:标注在JavaBean上,当Spring 的组件扫描功能打开后并且扫描到标注了这个组件的类的时候,就会在Spring中创建一个这个JavaBean的类的对象;
①在Spring中可声明两个以上类型相同的JavaBean对象
@Bean public Foo foo(){ return new Foo(); } @Bean public Foo foo1(){ return new Foo(); }
②当声明两个以上类型相同的JavaBean对象时,如果调用getBean(Foo.class), 按照类型查找Foo对象, 则发生异常:
No qualifying bean of type 'cn.tedu.bean.Foo' available: expected single matching bean but found 2: foo,foo1
③解决办法:
* 利用对象的ID和类型获取指定的一个对象
* 默认情况下创建对象方法的名称, 是对象的ID
对象 = ctx.getBean("对象ID", 对象类型); Foo foo = ctx.getBean("foo1", Foo.class);
④Bean名称(Bean ID )的规则:
* @Bean注解声明的JavaBean其Bean名称(BeanID) 是方法名称
* @Component声明的JavaBean其名称:
* 如果是标准的驼峰命名法, 则Bean 名称是类名首字母小写:
如类名ExampleBean 则 Bean名称为 exampleBean
* 如果类名中有连续两个以上大写字母, 则Bean名称为类名
如类名 MYTestBean则Bean名称为 MYTestBean
* @Component("自定义BeanID") 利用注解参数修改Bean名称
① Spring 默认情况下, 其按照单例规则管理对象
* Spring在容器启动时候, 会自动创建对象
* 任何时候 getBean获取的对象都是同一个对象的引用
* 在声明对象时候, 使用 @Scope("prototype")注解, Spring就按照多例管理对象, getBean获取的对象都是一个新的对象引用。
* 尽量使用Spring提供的默认规则. 使用单例对象, 被重复使用.
* 如果程序需要使用多个实例时候, 添加注解 @Scope("prototype")