spring框架1

 

spring优点

  • 低侵入设计,代码的污染极地
  • 独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write  Once ,Run Anywhere的承若
  • Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦
  • Spring的AOP支持将一些通用的任务和安全、事务、日志等进行集中式管理,从而提供了更好的复用
  • Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。
  • Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部

Spring框架的组成结构图如下所示

spring-overview

Spring有两个核心模块

1.控制反转(Inversion  Of  Control)(IOC)容器  (依赖注入dependency injection(DI))

2.面向切面编程AOP(Aspect  Oriented  Programming)

IOC控制反转

  • 控制反转它不是什么技术,而是一种设计思想
  • 传统的Java  SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建对象;而IoC是有专门一个容器来创建这些对象,是程序主动去创建依赖对象;而IoC是专门一个容器来创建这些对象,即由IoC容器来控制对象的创建;
  • IoC控制反转将对象的创建权交给了Spring,我们通过Spring,就不用每次去创建对象,只需要通过Spring容器调用getBean(name属性或id属性)获取对应的对象
//spring.xml文件
<?xml version="1.0" encoding="UTF-8"?>

<--
xmlns:xml  namespace (命名空间)

-->

<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">

<--
配置bean标签,创建bean对象
1.通过无参数的构造方法创建对象
2.通过静态方法创建对象
3.通过工厂方式创建对象
class:类名(包名+类名)
id:对象的标识,对象的名称
name:对象的名称
单例模式:singleton
多例模式:prototype
-->
        
    <--通过无参构造方法创建对象-->
<--通过无参数的的构造方法创建对象-->
    <bean id="user" class="com.zhiyou.modle.User" scope="prototype"></bean>

<!--
    2.通过静态方法创建对象
        factory-method:静态方法名称
-->
    <bean name="single" class="com.zhiyou.model.SingleTon"
        factory-method="getInstance"></bean>


3.使用实例工厂方法创建对象

  <bean name="factory" class="com.zhiyou.model.Factory" ></bean>
      <bean name="user2" class="com.zhiyou.model.User" 
       factory-bean="factory"  factory-method="getPeople"
       ></bean>


</beans>

 

//单例模式 singleton

package  coom.zhiyou.modle;


public  class  SingleTon{
    
    static SingleTon singleTon;
    //提供私有方法
    private SingleTon(){


}
    //提供一个静态的获取唯一对象的方法
    public static SingleTon getInstance(){
        
        if(singleTon==null){

        singleTon= new SingleTon();
        }
        return singleTon

        }

}
/**
    modle包下的user
*/
    
package com.zhiyou.model;

public class User extends People {
	
	public void running(){
		System.out.println("running...");
	}

}

/**
      modle包下的Factory
*/
public class Factory {

	
	public People getPeople(){
		return new User();
	}
	
}
/**
     modle包下的People
*/
public class People {

}




-----------------------------------------------------------------------


/**
    1.通过springIOC容器创建对象
    2.classPath对应的是src文件夹
    3.基于classpath的路径
     
*/

   
    ClassPathXmlApplicationContext  context = new 
        ClassPathXmlApplicationContext("spring.xml");

    User user =(User)Context.getBean("user");
    user.running();


    SingleTon singleTon = (SingleTon)context.getBean("single");
    System.out.println(singleTon);


    User user2 = context.getBean("user2");
    system.out.println(user2)












依赖注入

1.设值注入

设值注入是指IoC容器通过成员变量的setter方法来注入被依赖对象。这种注入方式简单、直观,因而在Spring的依赖注入里大量使用。

//UserDaoImpl类


package com.zhiyou.dao.impl;

import com.zhiyou.dao.UserDao;

public class UserDaoImpl implements UserDao {

	@Override
	public void addUser(String name) {
		// TODO Auto-generated method stub
		System.out.println("把用户"+name+"添加到数据库中了");		
	}

}



//UserServiceImpl类

package com.zhiyou.service.impl;

import com.zhiyou.dao.UserDao;
import com.zhiyou.dao.impl.UserDaoImpl;
import com.zhiyou.service.UserService;

public class UserServiceImpl implements UserService {

	UserDao userDao;
	String name;
	
	public void setName(String name) {
		this.name = name;
	}
	
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	
	public UserServiceImpl() {
		// TODO Auto-generated constructor stub
	}
	
	public UserServiceImpl(UserDao userDao) {
		// TODO Auto-generated constructor stub
		System.out.println("构造方法");
		this.userDao = userDao;
	}
	
	
	@Override
	public void addUser(String name) {
		// TODO Auto-generated method stub
		userDao.addUser(this.name);
	}

}
<!--属性赋值

property:使用setter方法给属性赋值
        name:属性名称
        ref:属性值(对象的名称)
        value:属性值
        简单类型:(基本数据类型+String)使用value
        其他引用类型使用ref

-->

<bean id="userDaoImpl" class="com.zhiyou.dao.impl.UserDaoImpl"></bean>

<bean id="userService" class="com.zhiyou.service.impl.UserServiceImpl">
    <property name="userDao ref="userDaoImpl"></proterty>
    <property name="name" value="李四"></proterty>
</bean>


<!--
    通过构造方法给属性赋值:
        使用constructor-arg标签
            name:构造方法参数名(属性名)
                ref:对象名称

-->

 <bean id="userService" class="com.zhiyou.service.impl.UserServiceImpl">
		<constructor-arg name="userDao" ref="userDaoImpl"></constructor-arg> 
   </bean>



//集合通过setter方法注入值
 <bean id="proService" class="com.zhiyou.service.impl.PropertyServiceImpl">
   		<property name="list" >
   			<list>
   				<value>abc</value>
   				<value>张三</value>
   			</list>
   		</property>
   		<property name="newList">
   			<list>
   				<value>20</value>
   				<value>hello</value>
   				<ref bean="user"/>
   			</list>
   		</property>
   		<property name="map">
	   		<map>
	   			<entry key="key1" value="aaa"></entry>
	   			<entry key="key2" value-ref="user"></entry>
	   		</map>
   		</property>
   		
   </bean>





        
   <!-- 
   		autowire:自动注入(自动给属性赋值)
   		byName:根据名称匹配进行赋值(在spring配置文件中查找和属性名称一模一样的bean对象)
   		byType: 根据类型匹配进行赋值(在spring配置文件中查找和属性类型一致的bean对象)
   				都是通过setter方法进行赋值
   				
    -->
    
 <!--   <bean id="msgDao2" class="com.zhiyou.dao.orcale.MsgDaoOracleImpl"/>  -->
   <bean id="MsgDao" class="com.zhiyou.dao.impl.MsgDaoImpl"></bean>
   
   <bean id="msgService" class="com.zhiyou.service.impl.MsgServiceImpl" autowire="byType" ></bean




set注入图解

 

constructor注入图解

给数组和list集合赋值

给set集合、map集合、properties集合赋值

自动注入(依赖注入)

所谓自动装配,就是将一个 Bean 注入到其他 Bean 的 Property 中

Spring 支持 4 种自动装配模式(bean的autowire属性),如下:

no —— 默认情况下,不自动装配,通过 ref  attribute手动设定。

byName —— 根据 Property 的 Name 自动装配,如果一个 bean 的 id,和另一个 bean 中的 Property 的 name 相同,则自动装配这个 bean 到 Property 中。

byType —— 根据 Property 的数据类型( Type )自动装配,如果一个 bean 的数据类型,兼容另一个 bean 中 Property 的数据类型,则自动装配。

constructor —— 根据构造函数参数的数据类型,进行 byType 模式的自动装配。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值