- SpringIOC
- 案例讲解
- 阅读一下
- helloSpring
- 无参构造
- IOC创建对象的三种方式(一共有三种,但是按照类型创建不推荐。略过。)
- 按照类型创建 ⇒ 略!
- 按照下标创建
- 按照名称创建(重点掌握就足以)
- 起别名
- import导入
- 依赖注入
- 构造器注入(前面已解释,此处略)
- set方式注入(重点)
- P命名和C命名注入
- bean 的作用域
- Bean的自动装配
- 注解实现自动配置(重点)
- 使用注解开发
- 使用@Service 正常,但@Resource 报错问题解决(原因记录如下)
- 衍生的注解
- 使用 JavaConfig 来实现配置
- 代理模式
- 静态代理
SpringIOC
案例讲解
先看示例:
原先的控制权在程序员手中(可以一直new直接创建)
但是现在可以将控制权,直接给到用户手中 ⇒ 耦合性大大降低!
阅读一下
建议先阅读一下
容器:Spring 是一个容器,因为它包含并且管理应用对象的生命周期。
控制反转:IOC (Inversion of Control),指的是将对象的创建权交给 Spring 去创建。
使用 Spring 之前,对象的创建都是由我们自己在代码中 new 创建。而使用 Spring之后。对象的创建都是由给了 Spring 框架。
IOC (Inversion of Control) 是指在程序开发中,对象实例的创建不再由调用者管理,而是由 Spring 容器创建。Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring 容器中,控制权发生了反转,这就是 Spring 的 IOC 思想。
IOC容器的概念:IOC 容器就是具有依赖注入功能的容器,IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中 new 相关的对象,应用程序由 IOC 容器进行组装。在 Spring 中 BeanFactory 是 IOC 容器的实际代表者。
Bean的概念:在 Spring 中,被 Spring 容器所管理的对象称之为”Bean”对象。一个 Spring 的 Bean 对象可以是任何形式的 POJO。
依赖注入:DI (Dependency Injection),是指依赖的对象不需要手动调用 setXX 方法去设置,而是通过配置赋值。
helloSpring
无参构造
这玩意 是造轮子用的 ⇒ 是靠 set方法 进行注入(可以吧实体类的 set 注释一下,看看结果)
案例如下(跟着敲一下就所有感受):
pojo:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private String name;public void test(){System.out.println("我的名字是:"+getName());}
}
ApplicationContext.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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="User" class="www.pojo.User"><property name="name" value="HelloSpring" /></bean>
</beans>
test:
public class Test1 {@Testpublic void test(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");User user = (User) applicationContext.getBean("User");user.test();}
}
或者用这个方法不需要 强转
IOC创建对象的三种方式(一共有三种,但是按照类型创建不推荐。略过。)
如果按照类型创建的话,有两个String类型,那就玩完。还是略过为好。
按照类型创建 ⇒ 略!
按照下标创建
按照名称创建(重点掌握就足以)
只要创建了 bean,就会被实例化,哪怕创建了,不用,都会自己 new 出来。
起别名
import导入
依赖注入
构造器注入(前面已解释,此处略)
set方式注入(重点)
- 依赖注入:set注入
- 依赖:bean 对象的创建依赖于容器
- 注入: bean 对象中的所有属性,由容器注入!
P命名和C命名注入
注意点:P命名和C命名 不能直接使用,如果想使用的话,请加入约束。
xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
bean 的作用域
- 单例模式(spring 的默认模式)
- 原型模式: 每次从容器中 get 的时候,都会产生一个新的对象!
Bean的自动装配
- 自动装配 是 spring 满足 bean 依赖一种方式!
- spring 会在上下文中自动寻找,并自动给bean装配属性。
在spring中有三种装配的方式
- 在 xml 中显示的配置
- 在 java 中显示的配置
- 隐式的自动装配 bean(重点)
注解实现自动配置(重点)
要使用注解须知
- 导入约束
<?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 http://www.springframework.org/schema/context/spring-context-3.0.xsd" 
- 配置注解的支持
<context:annotation-config />
- 使用注解
@Autowired
⇒ 默认是 ByName 模式
我们使用后,可以省去 set 方法,但前提是自动装配的属性,在 IOC 容器中存在,且符合名称(byName)。@Qualifier(@Value="xxx")
⇒ 先通过byType,后使用byName,如果都找不到则报错。 此注解可以指定唯一的注解。
等同于@Resource(name="xxx")
⇒ 先通过 byName去找,如果找不到的情况下,则会通过byType,如果两个都找不到,则报错。
使用注解开发
spring 4.0 以后,使用一些注解 要导入 aop.jar 包。别忘记哦~~ 。
<context:annotation-config />
⇒ 注解驱动
<context:component-scan base-package="www.Pojo" />
⇒ 扫描下包的注解
@Component
⇒ 等价于 组件一个 bean,这样就可以不在xml中,组件bean了。名字就是默认类的小写。
@Value
⇒ 可以给属性注入值
使用@Service 正常,但@Resource 报错问题解决(原因记录如下)
总体废话一下,有耐心看完下面的,没耐心可以略过哦~
我想说的是,一般@Resource用于值代入,但是@Service一般用于创建bean
⇒ 对不起大家,我是小白,这是我个人的理解,还望有大神在评论能帮我分析一下
@Service注解
@Service注解是Spring框架中用于标识业务逻辑层的组件的注解。它告诉Spring框架,被标记的类是一个业务逻辑组件,需要将其纳入Spring的上下文中进行管理。当应用程序启动时,Spring会自动扫描带有@Service注解的类,并将其作为Bean实例化,然后将其添加到Spring的上下文中。
@Service注解通常用于业务逻辑层的实现类上,它不仅可以用于类级别的注解,还可以用于方法级别的注解。当用于方法级别时,它表示该方法是一个业务逻辑方法,可以与其他组件进行协作。
在使用@Service注解时,需要注意它的作用范围。默认情况下,@Service注解的作用范围是单例的,即在整个应用程序中只有一个实例。如果需要创建多个实例,可以通过设置@Scope注解的值为prototype来实现。
@Resource注解(一般用在属性之中)
@Resource注解是Java EE规范中定义的注解,用于实现依赖注入。它告诉Spring框架,被标记的字段或方法需要注入一个依赖项。Spring会根据字段或方法的类型和名称,在上下文中查找匹配的Bean,并将其注入到被标记的字段或方法中。
@Resource注解可以应用于字段、setter方法和配置方法上。当应用于字段时,Spring会自动将匹配的Bean注入到该字段中。当应用于setter方法时,Spring会调用该方法并将匹配的Bean作为参数传递给它。当应用于配置方法时,Spring会将匹配的Bean作为该方法的返回值。
@Resource注解具有更广泛的应用范围,它不仅仅限于Spring框架,还可以在其他的Java EE规范中使用。另外,@Resource注解还可以通过name和type属性来指定注入的Bean的名称和类型。
衍生的注解
Component ⇒ 装配某个 bean。以下相同。
Dao ⇒ @Repository
Service ⇒ @Service
controller ⇒ @Controller
功能都是一样的,都是代表将某个类,注册到 spring 容器中,装配。
使用 JavaConfig 来实现配置
代理模式
为什么要学习代理模式?因为这就是SpringAOP的底层!
代理模式的分类:
- 静态代理
- 动态代理
静态代理
角色分析:
- 抽象角色:一般会使用接口或者抽象类来解决
- 真实角色:被代理的角色
- 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作
- 客户:访问代理对象的人