spring详解(一)之IOC控制反转

项目文件在资源管理(Spring1.rar)

spring路线图(IOC)
Spring 框架简介(Spring优势2大核心思想的体现 IOC(控制权利反转)以及Aop(面向切面))
Spring 入门案例(通过操作 看到对象的生成方式发生的不一样)
Spring 配置文件中 bean 标签详解 (比较重要的单例和多例的配置)
SpringIOC 讲解 (何为控制反转 为何依赖注入 以及依赖注入实现的几种方式)
Spring 整合 JDBC (通过引入数据操作,发现接口和实例对象的管理方式发生的变化)(含注解)

1**、Spring框架简介**
在未来有很多技术,这里可能需要用,那里可能需要用.我们称作为整合,Spring就来给我们提供整合方案,如何整合这就涉及到我们所说的IOC,当然也有人说spring是一个容器(其实当做插线板更好一些)
在这里插入图片描述
快速构建可生产的应用程序,快速使用spring进行项目的集成
构建可协调一切的分布式服务应用程序,提供统一的网关.统一的服务治理,统一的可控制面板,统一的数据消息处理
构建可统一进行数据清洗的ETL,完善数据仓库信息的,处理任何数据源

注意:最终的目的是为了方便我们把更多的心思放在需求的实现上面(用我们现有的技术体系)
注意:如果转换到使用的角度来说,spring(高度自律的管理者)管理着不同的技术所产生出来的对象

2Spring入门案例(观察使用步骤以及对象的生成方式)
.构建一个web项目,引入对应的jar包
在这里插入图片描述
.构建一个简单的实体

public class User {
	public void invoke(){
		System.out.println("普通方法只能被对象调用");
	}
}

构建spring管理的对象的全局文件application.xml

<beans  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns="http://www.springframework.org/schema/beans" 
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
		                    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">

	<!-- 将创建对象的权利交给springbean容器进行管理 -->
	<bean name="t1" class="com.wwj.model.User"></bean>

</beans>

测试

public static void main(String[] args) {
		ApplicationContext ac=new ClassPathXmlApplicationContext("application.xml");
				//2. 向容器“要”user 对象
				User u=(User) ac.getBean("t1");
				//3. 打印 user 对象
				System.out.println(u.getClass().getName());
				u.invoke();
	}
}

注意1:对象的生成权利交给了谁?谁在管理这个对象?

Spring配置文件中bean标签详解
name属性代表定义的标记,方便spring查找到需要管理对象的名字
class 填写管理对象的类型
在bean标签中有一个scope属性默认为(singleton),决定了对象是以单例还是多例的方式生成.可以改为prototype.(了解即可)
在bean标签中默认对象有一个生命周期(了解) 分别为 init-method 和 destory-method .控制一个对象的生命周期,方便我们更好的管理对象

public static void main(String[] args) {
		ApplicationContext ac=new ClassPathXmlApplicationContext("application.xml");
				//2. 向容器“要”user 对象
				User u=(User) ac.getBean("t1");
				User u1 = (User) ac.getBean("t1"); 
				System.out.println(u==u1);
				//3. 打印 user 对象
				System.out.println(u.getClass().getName());
				u.invoke();
				//关闭容器
				((ClassPathXmlApplicationContext) ac).close();
	}

SpringIOC 讲解 (何为控制反转 为何依赖注入 以及依赖注入实现的几种方式)
先看一下控制正转
在这里插入图片描述
在看一下控制反转
在这里插入图片描述
IOC:IOC是一种思想,我们称作为控制反转(也就是权利的移交)
依赖注入(对控制反转的进一步升华)(关心对象之间的依赖如何进行管理)
谁依赖于谁:当然是应用程序依赖于IoC容器;
谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象
注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)

我们可以思考出来spring容器等同于是一个万能的工厂,利用反射机制将对象生成出来,并且进行合理的管控
主要的目的为了解耦.避免代码的入侵

代码示例:假定 小白需要交通工具减轻上班的压力(小白和交通工具就产生了依赖)

public class Person {

    //这里等于这辈子就只能骑自行车了
	Bike  b   = new Bike();
	
	public  void  work(){
		b.go();
	}
}

小白富裕了, 要换B打头的车了 如果你改代码就等同于代码入侵,所以我们要抽象出交通工具

public class Person {

    //这里等于这辈子就只能骑自行车了
	//Bike  b   = new Bike();
	
	//你可以以后换啥都可以(可以通过设置和构造方法进行对象的注入)
    private  Transport  ts;
	
	public  void  work(){
		ts.go();
	}
}

使用Spring管理对象的注入的几种方式(关注属性注入即可(最常见)
注入的几种方式(属性注入,构造方法注入,数组,集合,map注入)

代码示例:

public class Vmodel {

	// 属性注入
	private  Vperson  vp;

	public void setVp(Vperson vp) {
		this.vp = vp;
	}
	
	//构造方法注入
    private String vname;
    
    public Vmodel(){
    	
    };
    public Vmodel(String vname){
    		 this.vname = vname;
    }
    
    //复杂类型注入
    private Object[] arr;// 数组类型注入
    private List list;//list/set 类型注入
    private Map map;//map 注入
}

对应的配置文件 (我们更多的看到的是ref关联对应的bean)

<!-- 属性注入 -->
	<bean name="p1" class="com.wwj.diimpl.Vperson">
		<property name="vpname" value="djwangweijie"></property>
	</bean>
	<bean name="v1" class="com.wwj.diimpl.Vmodel">
		<property name="vp" ref="p1"></property>
	</bean>

	<!-- 构造方法注入 -->
	<bean name="v2" class="com.wwj.diimpl.Vmodel">
		<constructor-arg name="vname" value="michael"></constructor-arg>
	</bean>

	<!-- 复杂类型的支持 -->
	<bean name="v3" class="com.wwj.diimpl.Vmodel">
		<property name="arr">
			<array>
				<value>tom</value>
				<value>jerry</value>
			</array>
		</property>
		<property name="list">
			<list>
				<value>tom1</value>
				<value>jerry1</value>
			</list>
		</property>
		<property name="map">
				<map>
					<entry key="A" value="abc"></entry>
					<entry key="B" value="bcd"></entry>
				</map>
		</property>
	</bean>

</beans>

测试文件

public static void main(String[] args) {
			ApplicationContext ac=new ClassPathXmlApplicationContext("application.xml");
			//属性
			Vmodel v1  = (Vmodel) ac.getBean("v1");
			System.out.println(v1.getVp().getVpname());
			//构造方法
			Vmodel v2  = (Vmodel) ac.getBean("v2");
			System.out.println(v2.getVname());
			//复杂类型
			Vmodel v3  = (Vmodel) ac.getBean("v3");
			System.out.println(v3.getArr().length);
			System.out.println(v3.getList().size());
			System.out.println(v3.getMap().size());
		}

Spring 整合 JDBC(含注解)
依赖的jar包
在这里插入图片描述
类的结构图如下
在这里插入图片描述
关心下我们的配置文件 application1.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		                    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">

	<!-- 连接管理交给C3P0 -->
	<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring"></property>
		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
		<property name="user" value="root"></property>
		<property name="password" value="root"></property>
	</bean>

	<!--JDBCTemplate 需要 datasource 连接池 -->
	<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

	<!-- 构建service 和 dao实例对象 -->
	<bean name="dandmDao" class="com.wwj.spring.jdbc.DandMDaoImpl">
		<property name="jdbcTemplate" ref="jdbcTemplate"></property>
	</bean>

	<bean name="FindService" class="com.wwj.spring.jdbc.FindServiceImpl">
		<property name="dandmDao" ref="dandmDao"></property>
	</bean>
</beans>

有没有发现虽然写起来不麻烦,但总要看看属性名再去填写配置文件
补充说明:使用注解的方式实现
依赖的jar包(多了aop)
在这里插入图片描述
配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns="http://www.springframework.org/schema/beans" 
		xmlns:context="http://www.springframework.org/schema/context"
		xmlns:aop="http://www.springframework.org/schema/aop" 
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
		                    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
							http://www.springframework.org/schema/context 
							http://www.springframework.org/schema/context/spring-context-4.2.xsd 
							http://www.springframework.org/schema/aop 
							http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 
							http://www.springframework.org/schema/tx 
							http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">     
	 <!-- 自动根据扫描对应包下面的注解,并实例化对应的对象 -->
	 <context:component-scan base-package="com.wwj.anotation"></context:component-scan>

	<!-- 连接管理交给C3P0 -->
	<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring"></property>
		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
		<property name="user" value="root"></property>
		<property name="password" value="root"></property>
	</bean>

	<!--JDBCTemplate 需要 datasource 连接池 -->
	<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
</beans>

注解配置
dao类

@Repository(value="dandmDao")
public class DandMDaoImpl  implements  DandMDao{
	@Resource
	private  JdbcTemplate  jdbcTemplate;

	@Override
	public List<Dad> getD() {
		// TODO Auto-generated method stub
		return jdbcTemplate.query("select * from dad", new RowMapper<Dad>(){

			@Override
			public Dad mapRow(ResultSet rs, int arg1) throws SQLException {
				// TODO Auto-generated method stub
				Dad d = new Dad();
				d.setDname(rs.getString("dname"));
				return d;
			}
			
		});

service类

@Service(value="fs")
public class FindServiceImpl implements  FindService{
	@Autowired
	private  DandMDao  dandmDao;

测试类

@Component(value="test")
public class Testanotation {
		@Autowired
		private  FindService  fs ;	
		public  void A(){
			fs.FindDandM();
		}
		public static void main(String[] args) {
			ApplicationContext ac=new ClassPathXmlApplicationContext("application2.xml");
			Testanotation tt = (Testanotation) ac.getBean("test");
			tt.A();
		}
}

注解说明1
@Service用于标注业务层组件(我们通常定义的service层就用这个)
@Controller用于标注控制层组件
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
注解说明2
@Resource、@Autowired
当需要在某个类中定义一个属性,并且该属性是一个已存在的bean
因为jdbc在读取xml的时候已经加载了
@Autowired 可以默认使用取的value名字 同时也可以通过加上@Qualifier进行指定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值