Spring基础学习,没有理论 都是干货

Posted itcastwzp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring基础学习,没有理论 都是干货相关的知识,希望对你有一定的参考价值。

##学习需要掌握:反射和最简单的MVC架构流程

##对spring有过基础性的理论知识

##按照代码一步步来,30分钟掌握Spring的基本使用

1:先用spring创建一个最简单的对象

首先创建一个对象
package com.itmayiedu.entity;

public class UserEntity 
    private String name;
    private Integer age;
    public String getName() 
        return name;
    
    public void setName(String name) 
        this.name = name;
    
    public Integer getAge() 
        return age;
    
    public void setAge(Integer age) 
        this.age = age;
    
创建spring的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" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 根据id userentity
    <bean id="userEntity" class="com.itmayiedu.entity.UserEntity" />
</beans>
##根据spring创建文件
package com.itmayiedu.entity.controller;

import com.itmayiedu.entity.UserEntity;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest 

    public static void main(String[] args) 
        ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("spring.xml");

        UserEntity userEntity = (UserEntity) application.getBean("userEntity");


        System.out.println(userEntity);

    

2:关于spring的单例等问题

    首先如何证明spring单例的

package com.itmayiedu.entity;

public class UserEntity 
    private String name;
    private Integer age;

    public UserEntity() 

        System.out.println("我创建了一个对象");
    

    public String getName() 
        return name;
    
    public void setName(String name) 
        this.name = name;
    
    public Integer getAge() 
        return age;
    
    public void setAge(Integer age) 
        this.age = age;
    

## 如果地址相同则证明是同一个对象,spring是单例的,
package
com.itmayiedu.entity.controller; import com.itmayiedu.entity.UserEntity; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainTest public static void main(String[] args) ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("spring.xml"); UserEntity userEntity = (UserEntity) application.getBean("userEntity"); UserEntity userEntity1 = (UserEntity) application.getBean("userEntity"); System.out.println(userEntity==userEntity1); System.out.println(userEntity);

## 输出结果:true

那么尽然spring是单例(在加载容器的时候便会初始化)如何变成多例的了(也就是更改作用域)?

   <!-- prototype -->
    <bean id="userEntity" class="com.itmayiedu.entity.UserEntity"  scope="prototype"/>

springioc创建对象的方式有哪些

构造函数

工厂创建对象

       工厂类 静态工厂

       工厂内  非静态工厂

想说一个根据构造函数来创建对象

无参函数刚刚已经说过那,这里主要说一下有参函数,在实体类中我们需要给给他声明一个有参函数

<!-- 无参构造函数 -->
    <bean id="user1" class="com.itmayiedu.entity.UserEntity" scope="prototype" />
    <!-- 有参构造函数 -->
    <bean id="user2" class="com.itmayiedu.entity.UserEntity">
        <constructor-arg name="name" type="java.lang.String"
                         value="张三"></constructor-arg>
        <constructor-arg name="age" type="java.lang.Integer"
                         value="18"></constructor-arg>
    </bean>

技术图片

 这里可以看到无参构造函数的优先于午参构造函数的

首先我们创建一个工厂类

package com.itmayiedu.entity;

import javax.swing.text.html.parser.Entity;

public class ObjectFactory 



    public  UserEntity getInstance()
        System.out.println();
        return new UserEntity("wwww",23);
    


    public static UserEntity getStaticInstance()
        System.out.println();
        return new UserEntity("ggg",66);
    
<?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:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">


    <!-- 无参构造函数 -->
    <bean id="user1" class="com.itmayiedu.entity.UserEntity" scope="prototype" />
    <!-- 有参构造函数 -->
    <bean id="user2" class="com.itmayiedu.entity.UserEntity">
        <constructor-arg name="name" type="java.lang.String"
                         value="张三"></constructor-arg>
        <constructor-arg name="age" type="java.lang.Integer"
                         value="18"></constructor-arg>
    </bean>


    <bean id="factory" class="com.itmayiedu.entity.ObjectFactory"></bean>
    <!-- 通过实例工厂方法创建 -->
    <bean id="user3" factory-bean="factory" factory-method="getInstance"></bean>
    <!-- 通过静态工厂方法创建 -->
    <bean id="user4" class="com.itmayiedu.entity.ObjectFactory"
          factory-method="getStaticInstance"></bean>


</beans>

 

技术图片

接下来讲讲spring的注入

注入的方式

通过构造函数(上面已经演示过)

通过set方法给对象赋值

p名称空间

自动装配

注解

 

在这里讲解set方法的注入

### 曾经迪士尼面试官问过一道题,在spring中加入A依赖B 如何进行注入, 当时特别简单的一道题,结果想歪啦.说什么A的实体类有一个B对象进行new,接下来进行正解

技术图片

技术图片

 技术图片

 

技术图片

这样的话,就完成了抵赖注入.

那么很多人很好奇问啦.为什么叫setter注入.没setter为什么就不行了.其实他底层用了反射setter方法修改属性办法,详情可以看我的过去的博客

https://www.cnblogs.com/itcastwzp/p/10971746.html  

 

P标签注入

 <bean id="userService" class="cn.itmayiedu.UserAction" p:userService-ref="userDao"></bean>

这种方式恨简单.但是用的人很少,作为了解就好

Spring注解

如果想使用spring的注解,我们需要在xml中开启注解的权限并且扫描注的范围

<context:component-scan base-package="com.cloudwalk"></context:component-scan>

@Respsitory  他的作用 类似   用于数据层

@Sevice  服务层

@Controller  控制层

作用类似

  <bean id="factory" class="com.itmayiedu.entity.ObjectFactory"></bean>

@Autowired类似

<property name="userDao" ref="userDao"></property>    

技术图片

 

 Spring的AOP

aop可以类似看重复的代码看成切面然后直接引用

首先xml开启aop

  <!--开启AOP注解-->
   <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

 

 

@Component
@Aspect
public class Aop 
/** 执行方法执行前**/ @Before(
"execution(* com.itmayiedu.entity.controller.UserService.add(..))") public void begin() System.out.println("开启事务");
/**执行方法执行后**/ @After(
"execution(* com.itmayiedu.entity.controller.UserService.add(..))") public void commit() System.out.println("事务提交"); /**执行方法抛异常**/ @AfterThrowing("execution(* com.itmayiedu.entity.controller.UserService.add(..))") public void error() System.out.println("啊,我有异常啦"); /**方法运行结束后**/ @AfterReturning("execution(* com.itmayiedu.entity.controller.UserService.add(..))") public void run() System.out.println("运行");

   然后直接调用即可

技术图片

这里难点和重点需要学习的是spring aop的表达式的写法 也就是这写aop执行在那些地方有效

具体参考https://www.cnblogs.com/imzhuo/p/5888007.html这位大佬的博客

 

下面详解如何xml配置aop

首先取消@aspect注解

技术图片

配置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" xmlns:p="http://www.springframework.org/schema/p"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd">
    
    
    
        <context:component-scan base-package="com.itmayiedu"></context:component-scan>
    
    
        <!-- 把切面类注入到容器中-->
        <bean id="aop" class="com.itmayiedu.entity.controller.Aop"> </bean>
            <aop:config>
                <!-- 书写spring aop 拦截表达式-->
                <aop:pointcut id="pf" expression="execution(* com.itmayiedu.entity.controller.UserService.add(..))"></aop:pointcut>
                <!-- 标记一个且表-->
                <aop:aspect ref="aop">
                    <!-- 用什么通知,通知用哪个拦截表达式-->
                    <aop:before method="begin" pointcut-ref="pf"></aop:before>
                    <aop:after method="commit"  pointcut-ref="pf"></aop:after>
                </aop:aspect>
            </aop:config>
    
    
    
    
    </beans>

    技术图片

    运行结果

  • 技术图片

     

 

以上是关于Spring基础学习,没有理论 都是干货的主要内容,如果未能解决你的问题,请参考以下文章

收藏 | 深度学习理论基础讲座

收藏 | 深度学习理论基础讲座

机器学习理论基础到底有多可靠?

贝叶斯机器学习:经典模型与代码实现!

Spring学习简介与IOC理论推导

Spring基础--- Spring基础配置