Spring简介,组成,拓展以及IOC本质

96 阅读2分钟

​ 本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1.新建一个Maven的普通项目(不用勾选模板)

2.对项目起一个名字

 3.在pom.xml里导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.0.RELEASE</version>
    </dependency>
</dependencies>

4.删除src文件夹

 5.新建一个子模块(Moudel)

 6.子模块还是不勾选模板

 7.起的第一个项目名字为:spring-01-ioc

 8.传统的建项目

在java文件夹里建一个包com.kuang.dao

 9.在包里新建一个UserDao接口

 在里面设置一个方法:

package com.kuang.dao;

public interface UserDao {
    void getUser();
}

 10.在包里新建一个UserDaoImpl类

 11.UserDaoImpl类的代码

package com.kuang.dao;

public class UserDaoImpl implements UserDao {
    public void getUser() {

        System.out.println("默认获取用户的数据");
    }
}

12.写一个实现类service,在里面在新建一个UserService接口

UserService接口也是实现getUser()方法即可;

13.在service包里新建一个UserServiceImpl类

package com.kuang.service;

import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;

public class UserServiceImpl implements UserService {


    private UserDao userDao=new UserDaoImpl();
    public void getUser() {

        userDao.getUser();
    }
}

14.写一个测试类进行测试

import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpl;

public class MyTest {

    public static void main(String[] args) {

        //用户实际调用的是业务层,dao层他们不需要接触!
        UserService userService=new UserServiceImpl();
        userService.getUser();
    }
}

运行截图:

 但是这样写弊端有很多很多!!!

15.按照上述写法就写死了,每次都要一次次修改代码

 16.可以改变UserServiceImpl类里面代码的写法

利用set进行动态实现值的注入!!!
package com.kuang.service;

import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;

public class UserServiceImpl implements UserService {


    private UserDao userDao;

    //利用set进行动态实现值的注入!!!
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void getUser() {

        userDao.getUser();
    }
}

17.这样就无需每次改变写的代码

 使用了set注入后,程序不再具有主动性,而是变成了被动的接受对象!

这种思想,从本质上解决了问题,我们程序猿不用再去管理对象的创建了。系统的耦合性大大降低~,可以更加专注的在业务的实现上!这是IOC的原型!

18.开始写一个程序HelloSpring

再新建一个子模块spring-02-hellospring,在java文件夹里新建一个包com.kuang.pojo,在里面新建一个类Hello

Hello类的代码

package com.kuang.pojo;

public class Hello {

    private String str;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    @Override
    public String toString() {
        return "Hello{" +
                "str='" + str + ''' +
                '}';
    }
}

19.在resources里新建一个beans.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">

    <!--使川Spring来创建对象,在Spring这些都称为Bean-->
    <bean id="hello" class="com.kuang.pojo.Hello">

        <property name="str" value="Spring"></property>
    </bean>

</beans>

20.在test的java文件夹里新建一个测试类MyTest

import com.kuang.pojo.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {

    public static void main(String[] args) {
        //获取Spring l的上下文对象!
        ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
        //我们的对象现在都在Spring中的管理了,我们要使用,直接去里面取出来就可以!
        Hello hello = (Hello) context.getBean("hello");
        System.out.println(hello.toString());
    }
}

运行截图:

 21.ref和value的区别

 22.修改一下上述子模块里的代码

<?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="mysqlImpl" class="com.kuang.dao.UserDaoMySqlImpl"/>
    <bean id="orcleImpl" class="com.kuang.dao.UserDaoOracleImpl"/>
    <bean id="UserServiceImpl" class="com.kuang.service.UserServiceImpl">
        <property name="userDao" ref="mysqlImpl"/>
    </bean>

</beans>

import com.kuang.dao.UserDaoMySqlImpl;
import com.kuang.dao.UserDaoOracleImpl;
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {

    public static void main(String[] args) {


        //获取Applicationcontext;拿到Spring的容器
        ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");

        //容器在手,天下我有,需要什么,就直接get什么!
        UserServiceImpl userServiceImpl = (UserServiceImpl) context.getBean("UserServiceImpl");//写的是id名
        userServiceImpl.getUser();
    }
}

IOC创建对象方式

目录

IOC创建对象方式

使用无参构造创建对象,默认!

要使用有参构造创建对象


 1.再新建一个子模块spring-03-ioc2,在java文件夹里新建一个包comkuang.pojo,里面再写一个类User

使用无参构造创建对象,默认!

User类:

package com.kuang.pojo;

public class User {
    private String name;

    public User(){
        System.out.println("User的无参构造!");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void show(){
        System.out.println("name="+name);
    }
}

beans.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="com.kuang.pojo.User">
        <property name="name" value="吴露"/>
    </bean>
</beans>

MyTest类:

import com.kuang.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User)context.getBean("user");
        user.show();
    }
}

要使用有参构造创建对象

package com.kuang.pojo;

public class User {
    private String name;

    public User(String name){
       this.name=name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void show(){
        System.out.println("name="+name);
    }
}

方法1:

【下标赋值】

<?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="com.kuang.pojo.User">
        <constructor-arg index="0" value="吴露"/>
    </bean>
</beans>

方法2;

【通过类型创建】---不建议使用

<bean id="user" class="com.kuang.pojo.User">
        <constructor-arg type="java.lang.String" value="吴露"/>
    </bean>

方法3:

【直接通过参数名】

<bean id="user" class="com.kuang.pojo.User">
        <constructor-arg name="name" value="吴露"/>
    </bean>

总结:在配置文件加载的时候,容器中管理的对象就已经初始化了!