解决层与层之间耦合问题,层与层之间只依赖于抽象接口,不依赖于具体,下层变动,上层不动。
MVC-dao每层都加了接口,都是为了代码的扩展性。
要把具体的实现类的new的过程由我们自身来new,交给第三方的组件来new,把new出来的对象保存起来。在程序运行期间动态的给成员变量赋值。
BeanFactory:加载本地的xml配置文件,把配置文件中配置的类实例化出来,保存。
ApplicationContext:负责实例化,配置和组装Bean;通过动态代理,实现了AOP面向切面编程。
两个实现类: ClasspathXMLApplicationContext:加载的xml元数据。在ssm项目中使用。AnnotationConfigApplicationContext:加载的注解配置类元数据。在springBoot项目使用。 WebApplicationContext:提供了对web上下文的支持,持有了ServletContext对象。控制反转:原来自己创建bean对象,交由spring来管理bean。
包扫描
// 启用包扫苗,识别类上的@Controller,@Service,@Repository,@Component,@Autowired。@Resource。@Qualifier <context:component-scan base-package="com.javasm"></context:component-scan> - @Service用于标注业务层组件 - @Controller用于标注控制层组件(如struts中的action) - @Repository用于标注数据访问组件,即DAO组件。 - @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 - @Scope用于指定scope作用域的(用在类上) - @PostConstruct用于指定初始化方法(用在方法上) - @PreDestory用于指定销毁方法(用在方法上) - @Autowired用在成员变量或set方法上。 - @Resource用在成员变量或set方法上。 bean标签 <bean id=“自定义名称” class="类名" scope="singleton|prototype" init-method="方法名" destory-method="方法名" lazy-init="true|false"> <bean id="sysuserService1" class="com.javasm.sys.service.SysuserServiceImpl1" scope="prototype" init-method="init" destory-method="close"></bean> bean标签的常用属性 id:给bean命名,id必须唯一class:确定类的名称,类必须存在。scope:bean的范围,默认scope=“singleton单例”,可选prototype原型,request,session,applicationinit-method:初始化方法,在DruidDataSource对象中,需要 init-method=“init” destroy-method=“close”destory-method:销毁方法。lazy-init:延迟加载。getBean的时候才初始化bean对象,也是单例 静态工厂实例化bean public class StaticFactory { public static ICar createBmw(){ return new BMW(); } } // 得到的是creatBmw方法返回的对象,而非StaticFactory对象 <bean id="bmw" class="com.javasm.beanFactory.StaticFactory" factory-method="createBmw"></bean> 实例工厂方法实例化bean public class SqlSessionFactoryBean { public SqlSessionFactory createFactory(){ InputStream resourceAsStream =null; try { resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml"); } catch (IOException e) { e.printStackTrace(); } return new SqlSessionFactoryBuilder().build(resourceAsStream); } } <!--实例工厂--> <!--new SqlSessionFactoryBean().createFactory()--> <bean id="sqlSessionFactoryBean" class="com.javasm.beanFactory.SqlSessionFactoryBean"></bean> <bean id="sessionFactory" factory-bean="sqlSessionFactoryBean" factory-method="createFactory"></bean>bean对象不是独立存在的,都有依赖关系。spring要在程序运行期间,动态的维护对象的依赖关系(赋值)
自动装配(配合包扫描一起使用)
<context:component-scan base-package="com.javasm"></context:component-scan> -在java代码中使用@Autowired或@Resource注解方式进行装配,这两个注解的区别是: @Autowired 默认按类型装配, @Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。 基于set方法的注入 <bean id="sysuserController" class="com.javasm.controller.SysuserController" init-method="init"> <property name="属性名" ref="bean的id"></property><!--set注入--> </bean> // 示例 <bean id="orderDao" class="com.javasm.service.OrderDaoBean"/> <bean id="orderService" class=" com.javasm.service.OrderServiceBean"> <property name="orderDao" ref="orderDao"/><!--set注入--> </bean> 基于构造器注入 public SysuserServiceImpl(ISysuseDao useDao,String str) { this.useDao = useDao; this.str = str; } <bean id="us" class="com.javasm.service.SysuserServiceImpl"> <constructor-arg name="useDao" ref="userDao"></constructor-arg> <constructor-arg name="str" value="fyt"></constructor-arg> </bean> 内部bean注入 <bean class="com.javasm.mapper.SysUserDaoImpl" id="userDao"> <property name="ds"> // 没有id(name)属性,所以不能被其它引用 <bean class="com.alibaba.druid.pool.DruidDataSource"> </bean> </property> </bean>