Spring基本知识总结

1.如果你的英语足够好可以去看spring的官网。
地址如下https://spring.io/

2.简单介绍spring

①开源轻量级框架,说白了就是简化开发

②核心部分:AOP切面编程:我理解的就是在不改变已有代码的情况下去扩展一些功能。

                   IOC控制反转:还记得刚学程序的时候么,是private Student stu=new Student();这么干的。ioc就是把这个过程                                                交给spring容器来处理。所以叫做控制反转。

                   DI依赖注入:这个是基于IOC的,也就是先交给spring管理,然后通过spring给属性注入值。

 ③spring在javaweb的三层结构中都有相应的解决方案。

           web层             springMVC

        service层            IOC

           dao层             jdbcTemplate(一般会被Hibernate、Mybatis代替)

3.导入jar包

   ①去官网下载

       下载并解压你会看到libs文件夹下的jar包有这样的特点

      

        spring-aop-5.0.5.RELEASE.jar这个是我们要用的jar包

        spring-aop-5.0.5.RELEASE-sources.jar这个是源码

  ②如果用spring的基本功能,导入4个核心的jar包就可以了。

     spring-context-5.0.5.RELEASE-javadoc.jar

      spring-core-5.0.5.RELEASE.jar

      spring-expression-5.0.5.RELEASE.jar

      spring-beans-5.0.5.RELEASE.jar

      另外还需要加入commons-logging-1.1.3.jar、log4j-1.2.11.jar两个日志的jar包,不然会出现下面异常:

     Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory

  ③创建spring核心配置文件:

       (1)spring核心配置文件名称和位置不是固定的,建议放到src下面,官方建议applicationContext.xml

      (2)引入schema约束

        spring-framework-5.0.5.RELEASE/docs/spring-framework-reference/core.html

        从官方下载的spring版本中找到docs->spring-framework-reference->core.html(中可以找到相关schema约束)

        如图:


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/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="user" class="test1.User" ></bean>


User类:

public class User {

public void show(){
    System.out.println("我是User");
}

}
测试类:

public class MainTest {

public static void main(String[] args){
    //1.加载xml文件
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    //2.拿到user对象,这里user是bean里面的id
    User user = (User)context.getBean("user");
    user.show();
}

}
运行结果:

经过上面的步骤,最简单的通过配置bean的方式来管理对象就成功了。下面详细总结一下。

spring管理bean方式(IOC):

           ①xml配置方式(xml方式)

           ②注解方式(用的最多)(注解方式)

spring属性注入方式(DI):

            ①set方法注入(重点)(xml方式)

            ②有参构造方法注入(xml方式)

            ③注解注入(用的比较多)(注解方式)

4.介绍Spring管理bean(xml方式)

  (1)先来介绍bean标签属性

       id:唯一标识,不能包含特殊字符。

       name:跟id作用一样,但是可以包含特殊字符。

       class:指定类的路径。

       scope(范围):singleton单例 ,prototype(多例)

 (2)bean实例化的三种方式:

     ①使用类的无参构造函数(重点)

     注意User类的变化,编写一个有参构造方法(此时不再有无参构造函数):


下面再运行会报异常:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'user' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [test1.User]: No default constructor found; nested exception is java.lang.NoSuchMethodException: test1.User.()

下面我手动再写一个无参构造函数,如下:

再来看运行结果,运行成功:

说明默认使用无参构造函数来实例化的。

②使用静态工厂实例化(创建静态方法,返回类的对象)

注意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/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="test1.BeanFactory" factory-method="getUser" ></bean>


创建静态工厂类BeanStaticFactory(注意里面的方法是 static的):

运行测试类MainText:

③使用实例工厂创建(创建非静态方法,返回类的对象)

注意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/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--<bean id="user" class="test1.BeanStaticFactory" factory-method="getUser" ></bean>-->
<bean id="beanCommonFactory" class="test1.BeanCommonFactory" ></bean>
<bean id="user" factory-bean="beanCommonFactory" factory-method="getUser"></bean>


创建普通工厂BeanCommonFactory

运行测试类MainText:

(3)属性注入

  一.使用有参构造函数注入属性

 User类

 

 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/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="user" class="test1.User" >
    <constructor-arg name="userName" value="小明"></constructor-arg>
</bean>
<!--<bean id="user" class="test1.BeanStaticFactory" factory-method="getUser" ></bean>-->
<!--<bean id="beanCommonFactory" class="test1.BeanCommonFactory" ></bean>
<bean id="user" factory-bean="beanCommonFactory" factory-method="getUser"></bean>-->


运行测试类MainTest结果:

二.使用set方法注入(重点)

User类:

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/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="user" class="test1.User" >
   <property name="userName" value="小明"></property>
</bean>
<!--<bean id="user" class="test1.BeanStaticFactory" factory-method="getUser" ></bean>-->
<!--<bean id="beanCommonFactory" class="test1.BeanCommonFactory" ></bean>
<bean id="user" factory-bean="beanCommonFactory" factory-method="getUser"></bean>-->


运行测试类MainText结果如下:

①注入对象类型:

注意applicationContext.xml变化

创建UserDao类:

创建UserService类:

修改MainTest类:

运行测试结果:

②注入复杂类型

数组、List集合、Map集合、Properties

修改UserService类:

public class UserService {

private UserDao userDao;
private Integer[] array;
private List<String> list;
private Map<String,String> map;
private Properties properties;
public UserDao getUserDao() {
    return userDao;
}
public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
}
public Integer[] getArray() {
    return array;
}
public void setArray(Integer[] array) {
    this.array = array;
}

public List<String> getList() {
    return list;
}
public void setList(List<String> list) {
    this.list = list;
}

public Map<String, String> getMap() {
    return map;
}
public void setMap(Map<String, String> map) {
    this.map = map;
}
public Properties getProperties() {
    return properties;
}
public void setProperties(Properties properties) {
    this.properties = properties;
}

}
修改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/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="userDao" class="test2.UserDao"></bean>
   <bean  id="userService"   class="test2.UserService">
        <property name="userDao"  ref = "userDao"></property>
        <property name="array">
            <list>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </list>
        </property>
       <property name="list">
           <list>
               <value>小明1</value>
               <value>小明2</value>
               <value>小明3</value>
           </list>
       </property>
       <property name="map">
           <map>
               <entry key="a" value="A"></entry>
               <entry key="b" value="B"></entry>
               <entry key="c" value="C"></entry>
           </map>
       </property>
       <property name="properties">
           <props>
               <prop key="userName">test</prop>
               <prop key="password">123456</prop>
           </props>
       </property>
    </bean>


修改MainTest类

public class MainTest {

public static void main(String[] args){
    //1.加载xml文件
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    //2.拿到user对象,这里user是bean里面的id
    //User user = (User)context.getBean("user");
    UserService userService = (UserService)context.getBean("userService");
    UserDao userDao=null;
    Integer[] array=null;
    List<String> list=null;
    Map<String,String> map=null;
    Properties properties=null;
    if(userService!=null){
         userDao=userService.getUserDao();
        array=userService.getArray();
        list=userService.getList();
        map=userService.getMap();
        properties=userService.getProperties();
    }
    if(array!=null){
        for(int i=0;i<array.length;i++){
            System.out.println(array[i]);
        }
    }
    if(list!=null&&list.size()>0){
        for (String s:list){
            System.out.println(s);
        }
    }
    if(map!=null){
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }
    if(properties!=null){
        for (Map.Entry<Object, Object> entry : properties.entrySet()) {
            System.out.println(entry.getKey() + "=" + entry.getValue());
        }
    }

}

}
运行结果:

5.Spring管理Bean(注解方式)
注解就是给类打上标记,这样spring才能识别管理

注解可以打在类上,也可以打在属性上

一:使用注解来创建对象

打在类上的注解:

                   @Controller(习惯放在web层)

                   @Service(习惯放在业务层)

                   @Repository(习惯放在持久层)

                   @Component

        目前这四个注解的功能是一样的,都是放在类上用来创建对象。

需要再引入spring-aop-5.0.5.RELEASE.jar jar包

修改applicationContext.xml(多了spring-context.xsd schema约束,在联网的情况下输入<context:component-scan base-package="test1,test2"></context:component-scan>会自动添加约束)

修改User类:(@Component(value="user") 这里user相当于bean里面的id,可以省略value值)

MainText类:

public class MainTest {

public static void main(String[] args){
    //1.加载xml文件
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    //2.拿到user对象,这里user是bean里面的id
    User user = (User)context.getBean("user");
    user.show();
}

}
运行结果(省略)

spring通过@Scope(value="prototype")实现多例,spring默认生成的对象是单例的

如下:

@Component(value = "user")
@Scope(value = "prototype")
public class User {

private String userName;

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public void show(){
    System.out.println("我是User");
    System.out.println("我的userName属性值:"+this.userName);
}

}
MianTest测试:

public class MainTest {

public static void main(String[] args){
    //1.加载xml文件
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    //2.拿到user对象,这里user是bean里面的id
    User user1 = (User)context.getBean("user");
    User user2 = (User)context.getBean("user");

// user.show();

    System.out.print(user1==user2);
}

}
运行结果:

二:使用注解来注入属性

@Autowired (按类型装配)

@Resource(按名称装配)

关于这两个注解的区别大家可以去网上找些资料,关于他们的资料很多

直接上代码:

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"
   xmlns:context="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
    http://www.springframework.org/schema/context/spring-context.xsd">
<!--可以扫描包下面的 类、属性、方法上的注解-->
<context:component-scan base-package="test1,test2"></context:component-scan>


UserDao类:

@Repository
public class UserDao {

public void show(){

    System.out.println("我是UserDao");
}

}
UserService类:(这里用的是@Autowired注解,关于@Resource注解,下去可以自己试试)

@Service
public class UserService {

@Autowired
private UserDao userDao;

public UserDao getUserDao() {
    return userDao;
}

public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
}

}
测试MainText类:

public class MainTest {

public static void main(String[] args){
    //1.加载xml文件
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    //2.拿到user对象,这里user是bean里面的id
    UserService userService = (UserService)context.getBean("userService");
    UserDao userDao=userService.getUserDao();
    if(userDao!=null){
        userDao.show();
    }
}

}
运行结果省略。
————————————————
版权声明:本文为CSDN博主「ordinarySmile」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qiwansong/article/details/80011931

上一篇:Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.


下一篇:Spark_SQl