本人小白一枚,欢迎大家一起讨论学习,如有错误,还望大家指教。
Spring概述什么是spring
Spring是分层的Java SE/EE应用full-stack
轻量级开源框架,以IOC(Inverse Of Control:控制反转)和AOP(Aspect Oriented Programmaing:面向切面编程)为内核
,提供了展现层Spring MVC和持久层Spring JDBC以及业务事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架。
spring的优点
spring的体系结构
创建持久层接口并创建实现该接口的实现类。
public interface AccountDao {
void saveAccount();
}
public class AccountDaoImpl implements AccountDao {
@Override
public void saveAccount() {
System.out.println("保存成功!");
}
}
创建服务层接口并创建实现该接口的实现类。
public interface AccountService {
void saveAccount();
}
public class AccountServiceImpl implements AccountService {
private AccountDao dao;
@Override
public void saveAccount() {
dao.saveAccount();
}
}
创建表现层,并添加测试类。
public class AccountDemo {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
AccountService service = ac.getBean("accountService", AccountServiceImpl.class);
AccountDao dao = (AccountDao) ac.getBean("accountDao");
System.out.println(service);
System.out.println(dao);
}
}
使用静态工厂的方法创建对象。
public class StaticFactory {
public static AccountDao creatAccountDao() {
return new AccountDaoImpl();
}
}
使用实例工厂的方法创建对象。
public class InstanceFactory {
public AccountDao createAccountDao() {
return new AccountDaoImpl();
}
}
spring的依赖注入
依赖注入,Dependency Injection,它是spring框架核心ioc的具体体现。在我们程序编写时,,通过控制反转把对象创建并注入到容器中,ioc解耦只是降低程序间的耦合,并不会消除,如果代码中出现依赖关系,那我们怎么解决呢?例如我们的业务层调用持久层。简单地说,就是坐等框架把持久层对象传入到业务层,而不是用我们自己去获取持久层对象。
constructor-arg
:构造函数注入,在bean标签内部,它有以下属性:
type
:用于指定要注入数据的数据类型,该类型也是构造函数中某个或某些参数的类型。
index
:用于给构造函数中指定的索引位置的参数进行赋值,所以从0开始。
name
:用于给构造函数中指定名称的参数赋值,这个也是最常用的。
value
:用于给基本数据类型和String类型进行赋值。
ref
:用于指定其他bean类型的数据,指的是在spring中IOC核心容器中出现过的对象。
public class AccountServiceImpl implements AccountService {
private String name;
private int age;
private Date birthday;
public AccountServiceImpl(String name, int age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
}
@Override
public void saveAccount() {
System.out.println(name + ":" + age + ":" + birthday);
}
}
测试并查看结果
public class AccountDemo {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
AccountService service = ac.getBean("accountService", AccountServiceImpl.class);
service.saveAccount();
}
property
:使用set方法注入,注意使用该方法时,要注入的类中要含有无参构造器,因为spring是通过无参构造器反射出对象,之后使用set方法进行赋值。
name
:找的是类中set方法后面的部分,并且首字母小写,例如:setUsername,则写username即可。
ref
:给其他引用类型赋值。
value
:给基本数据类型和String类型进行赋值。
注入集合属性
对类中的集合成员进行赋值,这里同样使用set方法注入。
public class AccountServiceImpl implements AccountService {
private String[] myStrs;
private List myList;
private Set mySet;
private Map myMap;
private Properties myProps;
public void setMyStrs(String[] myStrs) {
this.myStrs = myStrs;
}
public void setMyList(List myList) {
this.myList = myList;
}
public void setMySet(Set mySet) {
this.mySet = mySet;
}
public void setMyMap(Map myMap) {
this.myMap = myMap;
}
public void setMyProps(Properties myProps) {
this.myProps = myProps;
}
@Override
public void saveAccount() {
System.out.println("myStrs:" + Arrays.toString(myStrs));
System.out.println("myList:" + myList);
System.out.println("mySet:" + mySet);
System.out.println("myMap:" + myMap);
System.out.println("myProps:" + myProps);
}
}
myStrsA
myStrsB
myStrsC
myListA
myListB
myListC
mySetA
mySetB
mySetC
AAA
BBB