Spring若干知识点

<Bean>

1.默认使用无参方法创建对象,也可以使用有参方法构造

2.需要被注入对象的Set方法

3.bean的配置

<!--bean就是java对象,由Spring创建和管理-->

<!--
   id 是bean的标识符,要唯一,如果没有配置id,name就是默认标识符
   如果配置id,又配置了name,那么name是别名
   name可以设置多个别名,可以用逗号,分号,空格隔开
   如果不配置id和name,可以根据applicationContext.getBean(.class)获取对象;

class是bean的全限定名=包名+类名
-->
<bean id="" class="" name="">
    <property name="" value=""/>
    <property name="" ref=""/>
</bean>

4.项目中如果有多个人开发,可以利用import将所有人的xml配置到一个applicationContext合作开发使用

<import resource="{path}/beans.xml"/>

5.注入的方式有三种构造器注入,set注入,扩展方式注入,下面介绍set方法注入:

        常量注入,bean注入,数组注入,List注入,Map注入,set注入,null注入,Properties注入

        狂神说Spring03:依赖注入(DI)

6.对于构造器注入与set注入有两种简便方式——p命名空间 c命名空间

 导入约束 : xmlns:p="http://www.springframework.org/schema/p"
 <!--P(属性: properties)命名空间 , 属性依然要设置set方法-->
 <bean id="user" class="com.kuang.pojo.User" p:name="狂神" p:age="18"/>

 导入约束 : xmlns:c="http://www.springframework.org/schema/c"

 <!--C(构造: Constructor)命名空间 , 属性依然要设置set方法-->  <bean id="user" class="com.kuang.pojo.User" c:name="狂神" c:age="18"/>

 7.bean的作用域

图片

Singleton

当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例

<bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" scope="singleton">

Prototype

当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例

<bean id="account" class="com.foo.DefaultAccount" scope="prototype"/>  
  或者
<bean id="account" class="com.foo.DefaultAccount" singleton="false"/>

Request

表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效

<bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>

Session

当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

8.Spring中有三种装配机制

  1. 在xml中显式配置;

  2. 在java中显式配置;

  3. 隐式的bean发现机制和自动装配。

下面主要介绍第三种

autowire byName (按名称自动装配)

当一个bean节点带有 autowire byName的属性时。

  1. 将查找其类中所有的set方法名,例如setCat,获得将set去掉并且首字母小写的字符串,即cat。

  2. 去spring容器中寻找是否有此字符串名称id的对象。

  3. 如果有,就取出注入;如果没有,就报空指针异常。

autowire byName (按名称自动装配)

使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。

9.利用注解实现自动装配

使用注解之前需要在xml中引入context文件头

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd

而后启动注解支持

<context:annotation-config/>

10.自动装配注解

@Autowired

  • @Autowired是按类型自动转配的,不支持id匹配。

  • 需要导入 spring-aop的包!

  • 按照类型转置,将所需要注入的的bean放入配置文件中,将注解在属性上标注即可使用

@Autowired(required=false)  说明:false,对象可以为null;true,对象必须存对象,不能为null 

 

@Qualifier

  • @Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配

  • @Qualifier不能单独使用。

  • 按照bean内的id寻找需要注入的属性

 

@Resource

  • @Resource如有指定的name属性,先按该属性进行byName方式查找装配;

  • 其次再进行默认的byName方式进行装配;

  • 如果以上都不成功,则按byType的方式自动装配。

  • 都不成功,则报异常。

11.组件注解Component以及其三个衍生注解,功能相同只为区分MVC三层架构

为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。

  • @Controller:web层

  • @Service:service层

  • @Repository:dao层

使用这些就相当于取代了配置文件中的<bean>了,但是在使用之前要在配置文件中设置需要扫描的包,还要设置context文件头,如第9点所示

<!--指定注解扫描包-->
<context:component-scan base-package="com.kuang.pojo"/>

 12.基于Java类进行配置

可以通过构建Config类,在c类上面加注解@Configuration,代表这是一个配置类

狂神说Spring05:使用注解开发【狂神说Java】Spring5最新完整教程IDEA版通俗易懂_哔哩哔哩_bilibili 15集

13.代理模式

【狂神说Java】Spring5最新完整教程IDEA版通俗易懂_哔哩哔哩_bilibili 18集

14.动态代理(我蒙了)

public class ProxyInvocationHandler implements InvocationHandler {
   
//1.接口
   private Rent rent;
//2.set接口
   public void setRent(Rent rent) {
       this.rent = rent;
  }

//3.生成代理类,重点是第二个参数,获取要代理的抽象角色!之前都是一个角色,现在可以代理一类角色
   public Object getProxy(){
       return Proxy.newProxyInstance(this.getClass().getClassLoader(),
               rent.getClass().getInterfaces(),this);
  }

//   proxy : 代理类 method : 代理类的调用处理程序的方法对象.
//4. 处理代理实例上的方法调用并返回结果
   @Override
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       seeHouse();
       //核心:本质利用反射实现!
       Object result = method.invoke(rent, args);
       fare();
       return result;
  }

   //看房
   public void seeHouse(){
       System.out.println("带房客看房");
  }
   //收中介费
   public void fare(){
       System.out.println("收中介费");
  }

}

记住即可,唯一改变的是接口,还有其他的中间过程

//租客
public class Client {

   public static void main(String[] args) {
       //1.真实角色
       Host host = new Host();
       //2.代理实例的调用处理程序
       ProxyInvocationHandler pih = new ProxyInvocationHandler();
       //3.将真实角色放置进去! 
       pih.setRent(host); 
       //4.动态生成对应的代理类!
       Rent proxy = (Rent)pih.getProxy();
       //5.调用方法
       proxy.rent();
  }

}

15.实现AOP的三种方式(我也蒙了)

        一.使用SpringAPI实现

        二.自定义类实现

        三.使用注解实现

【狂神说Java】Spring5最新完整教程IDEA版通俗易懂_哔哩哔哩_bilibili

狂神说Spring07:AOP就这么简单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值