初识spring

一.什么是spring

spring是以IOC(控制反转)和AOP为核心的框架。是企业Java web开发框架,用于解决企业复杂性问题。

二.IOC和DI的区别

先说说什么是IOC,IOC俗称控制反转,在传统编程中,获取对象的方式是通过new关键字来创建一个对象。而在spring框架中,通过IOC这个第三方容器来获取对象。
应用程序在没有引入IOC容器之前,对象A依赖对象B,再对象A实例化或者运行到某一阶段时自己就必须主动创建对象B或者使用已经创建好的对象B, 无论哪种方式,控制权都在应用程序本身;有了IOC容器,对象A实例化和运行时,如果需对象B,IOC就会主动去创建对象B,注入到对象A需要的地方。就这样对象A获取依赖对象由原来的主动变为被动,这就是控制反转。
接下来就说说DI,俗称依赖注入。就是IOC容器在运行中动态的把某种依赖关系注入到对象中。比如把对象B注入(赋值)给对象A的成员变量。
其实本质上IOC和DI是对同一件事情的不同描述,依赖是从应用程序角度来讲,即应用程序依赖容器来创建并注入它需要的外部资源;控制反转是从容器角度来讲,即容器控制应用程序,由容器反向的向应用程序来注入应用程序需要的外部资源。
下面是简单的示例
1.创建spring项目在这里插入图片描述

2.先看看什么是ioc,创建UserDao接口及其实现类UserDaoImp

package ioc;

public interface UserDao {
    public void login();

}
package ioc;

public class UserDaoImp implements UserDao {
    //实现login()方法
    public void  login(){
        System.out.println("UserDao login");
    }
}

3.创建spring的配置文件applicationContext.xml

在这里插入图片描述
4.创建IOC类

package ioc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class IoC {
    public static void main(String[] args) {
        //初始化spring容器,加载配置文件
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过容器获取userDao实例
        UserDao userDao=(UserDao) applicationContext.getBean("UserDao");
        userDao.login();
    }
}

5.结果如下
在这里插入图片描述
6.再看看什么是DI,创建以下接口和其对应实现类

package ioc;

public interface UserService {
    public void login();
}
package ioc;

public class UserServiceImp implements  UserService {
    //声明userDao属性
    private UserDao userDao;
    //添加userDao属性的setter()方法用于实现依赖注入
    public void setUserDao(UserDao userDao){
        this.userDao=userDao;
    }
    public void login(){
        //调用userDao中的login()方法
        this.userDao.login();
        System.out.println("UserService login");
    }
}

7.在配置文件中配置以下代码
在这里插入图片描述
8.创建DI类

package ioc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DI {
    public static void main(String[] args) {
        //初始化spring容器,加载配置文件
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过容器来获取userService实例
        UserService userService=(UserService) applicationContext.getBean("UserService");
        userService.login();
    }
}

9.结果
在这里插入图片描述

三.Bean的作用域

Bean是项目中的业务功能,通过容器来管理。那他的作用范围包括那些,主要看两种作用域,一种是singleton(单例),singleton定义的Bean在容器中只有一个实例,无论多少Bean引用它,始终指向同一个对象
另一种是prototype(原型),prototype定义的Bean,在引用时每次都会创建一个新的Bean实例。

四.Bean的装配方式

1.基于xml的装配(分为设值注入和构造注入)
设值注入要求Bean类有一个无参的构造方法和为注入的属性提供对应的setter方法。构造注入则是有注入的参数
以下有构造注入和设值注入的例子

package assemble;

import java.util.List;

public class User {
    private  String userName;
    private  String password;
    private List<String>  list;
    /**
     * 1.使用构造注入,提供所有带参的构造方法

     */
    public User(String userName,String password,List<String> list){
        super();
        this.list=list;
        this.password=password;
        this.userName=userName;
    }
    @Override
    public String toString(){
        return "User[userName="+userName+",password="+password+",list="+list+"]";
    }
    /**
     * 2.使用设值注入,提供默认空参的构造方法,为所有属性提供setter()方法
     */
    public User(){
        super();
    }

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

    public void setPassword(String password) {
        this.password = password;
    }

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

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class XmlAssembleTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.XML");
        System.out.println(applicationContext.getBean("user1"));
        System.out.println(applicationContext.getBean("user2"));
    }
}

下面是xml的配置方式
user1是构造注入,user2是设值注入
在这里插入图片描述
在这里插入图片描述
下面是结果,可以看出,xml配置成功
在这里插入图片描述
2.基于Annotation的装配
说几个常用的
@Repository 用于数据访问层DAO层标识为spring的Bean
@Service 用于业务层Service层
@Controller 用于控制层
@Resource 用于对Bean变量,属性的setter 方法进行配置

例如@Service(“userService”)
就相当于<bean id=“userService” class=“ioc.userServiceImp” / >

@Resource(name=“userDao”)
就相当于<property name=“userDao” ref=“UserDao” / >
3.自动装配
常用的就是利用byName来根据属性的名称自动装配

<!--使用bean元素的autowire属性完成自动装配-->
    <bean id="UserDao" class="automation.UserDaoImp"/>
    <bean id="UserService" class="automation.UserServiceImp" autowire="byName"/>
    <bean id="userController" class="automation.UserController" autowire="byName"/>
</beans>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值