一.什么是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>