Spring核心概念
怎么说呢?
IOC,假如我们一个Servlet已经被实现了,且部署到服务器中,但是我们由于业务逻辑需要更实现类,那我们是不是要重新停掉服务器等一系列工作,这样会很麻烦,而且程序之间耦合度偏高,所以Spring提供IOC容器,将对对象的创建放在容器里,他能根据我们程序外的代码来帮我们确定对象的创建。
IOC: 由外部创建对象,里面的对象成为bean。
DI: Spring会自动判断IOC中有依赖关系的bean,对他们进行绑定,看上述我们调用service,按程序执行dao层对象应该为创建,但是Spring已经我们创建好
bean配置
<?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">
<!-- <!–1.导入spring的坐标spring-context,对应版本是5.2.10.RELEASE–> -->
<!-- id是唯一标识符,class是你要创建的类,id是getbean就是用这个id来看的 -->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" name="dao"></bean>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"
name="service service1 service2"
scope="prototype">
<!-- 1.name就是起别名,可以多个用, ; 分割都可,但是建议还是用id作为唯一。
2.scope,切换非单例模式,创还多个对象 -->
<!-- 7.配置service和dao的关系
property表示配置当前bean的属性,
name属性表示配置哪一个具体的属性
ref属性表示参照哪一个bean,ref对应bean的id
-->
<property name="bookDao" ref="dao"/>
</bean>
</beans>
其实,你发现他这个其实不需要对象不同,而是通过对象进入的数据不同,因此一个对象,封装多个逻辑即可,产生不同的结果。
错误调试
从这里开始,错误需要一步步从下往上排查,不对但本身就是从底层出错点,往上抛的,不对,他都显示这个类里,先是方法再到类,
怎么说呢?遇到错误抛出点,从底层看,先自己读,如果读不懂就翻译。
bean的实例化
new bean的4种方式,实例工厂了解,因为在套娃
1.默认,不写了。
2.静态工厂,
你让spring new bean是静态工厂这个对象,但是你根本上是获取是new abean 对象,所以设置factory-method 方法啊,让他调用这个方法,来返回你想获取的对象。
3.原始实例工厂
4.创新的实例工厂
/*
* AppForInterstanceUser*/
public class AppForInstanceUser {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
// 创建实例工厂对象,实例工厂对象里面已经通过反射来获取你要的对象类型和对象(实际类型)
UserDao userDao1 = (UserDao) ctx.getBean("userDao1");
System.out.println(userDao1);
userDao1.save();
}
}
/**
* UserDaoFactoryBean
*@return
*/
//FactoryBean创建对象
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
// 获取对象
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
// 获取对象类型
public Class<?> getObjectType() {
return UserDao.class;
}
// 判断是否单例
@Override
public boolean isSingleton() {
return false;
}
}
<?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">
<!--方式四:使用FactoryBean实例化bean-->
<bean id="userDao1" class="com.itheima.factory.UserDaoFactoryBean"/>
</beans>
1.Spring ioc new bean 给我们默认调用无参构造方法,通过反射来调用,反射,反正就是程序的任何部分,假如我们拿到一类的Class实例,知道相应的字符串名,那么我们可以调用里面相应的方法或者修改相应的属性,这么说的话,spring通过配置文件拿到我们配置相应的class实例字符串,然后给我们将对象new出来
bean生命周期