框架其实就是一个软件的半成品,为解决问题制定一套约束,对功能进行扩充。只要用框架就需要导入jar包,才能使用方法。
如果类和属性都不固定就需要反射机制。
类库:提供的类没有封装一定的逻辑,需要用的时候直接调用
框架:
Spring本质是管理软件中的对象,即创建和维护对象之间的关系。
Spring是一个开源的轻量级的应用开发框架,其目的是用于简化企业级应用 开发,降低代码的侵入性和耦合度。
Spring提供的Ioc(控制反转)和aop(面向切面编程)功能,可以将容器内的组件耦合度降低,即解耦,为将来的工程代码的维护提供了方便。
IOC:是指程序中对象的获取方式发生了反转,由最初的new方式创建,转变为由第三方框架创建、注入,他们降低了对象之间的耦合度;spring容器采用注入(DI)方1式实现了IOC控制,IOC是Spring框架的基础和核心;
DI:依赖注入:就是将一起工作具有关系的对象,通过构造方法或方法传入建立关联,因此容器的工作就是创建bean时注入那些依赖关系;
IOC是一种思想,而DI是实现IOC的主要技术途径,注入有两种方式:setter注入和构造注入;
spring为系统提供了一个整体的解决方案,开发者除了可以利用它本身具有的功能外,还可以与第三方框架和技术整合应用,可以自由选择使用哪些技术开发
在Spring中,所有的Java类和Javabean都将被当成Bean处理,这些Bean通过容器来管理和使用
Spring容器实现了IOC和AOP机制,这些机制可以简化Bean对象创建和Bean对象之间的解耦。
Spring容器有BeanFactory &ApplicationContext两种类型。
什么是JavaBean?一种简单规范的Java实例对象
何时使用Spring容器?当需要管理JavaBean对象时候就可以使用,Spring是最简洁的对象管理方案之一。
spring容器的实例化:
ApplicationContext继承BeanFactory接口,具有更多的企业级方法,建议使用该类型:实例化方法如下:
//加载classpath下的配置文件实例化:
String conf = “applicationContext.xml”
ApplicationContext ac = new ClassPathXmlApplicationContext(conf);
spring容器的使用:
从根本上理BeanFactory & ApplicationContext仅仅是一个维护Bean定义以及Bean之间关系相互依赖的高级工厂接口。所以我们可以通过BeanFactory & ApplicationContext访问Bean定义。
首先要在容器配置文件applicationContext.xml添加Bean的定义:
1、Hibernate使用组件作为复合主键时,该组件类必须满足一个条件就是:实现java.io.serializable接口。
2、MyBatis中配置缓存时,持久层需实现序列化。缓存元素
3、持久存储,将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本。
4、按值封送,尤其是在分布式系统中。如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对 象的一个精确副本。
实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复! 容器对Bean的管理:(3种spring容器创建bean对象的方法)
1.用构造器来实例化:
2.使用静态工厂方法实例化
3.使用实例工厂方法实例化 ```java
//这个是Test里面的代码 @Test public void test2(){ String cfg=”applicationContext.xml”; ApplicationContext ac=new ClassPathXmlApplicationContext(cfg); System.out.println(ac); Calendar cal1= (Calendar) ac.getBean(“obj1”); System.out.println(cal1); Calendar cal2 = ac.getBean(“obj2”,Calendar.class); System.out.println(cal2); Date date = ac.getBean(“obj4”,Date.class); System.out.println(date); //bean的作用域(单例和多例) Calendar cal5 = (Calendar) ac.getBean(“obj5”); Calendar cal6 = (Calendar) ac.getBean(“obj5”); System.out.println(cal5==cal6);//true(单例true多例false) System.out.println(cal5.equals(cal6));//true(单例true多例false) }
Bean的别名:在Spring容器中,每个bean都有名字即所谓的标识,该名字可以由<bean>元素的id或name属性来制定。Bean的别名即为已经定义好的Bean再起一个名字来使用,用<alias>指定:<alias name = “oldName” alias = “newName”><br />
<bean id="student" class="com.zhiyou100.entity.Student" autowire="byType">
</bean>
public class Student implements Serializable{ /*
* 自动装配:通过Spring自动装配机制,自动为一个bean装配其关联的bean
* 采用autowire="byType",即按照bean的类型进行自动装配
*/
private Computer computer;
private MobliePhone mobliePhone;
public Computer getComputer() {
return computer;
}
public void setComputer(Computer computer) {
this.computer = computer;
}
public MobliePhone getMobliePhone() {
return mobliePhone;
}
public void setMobliePhone(MobliePhone mobliePhone) {
this.mobliePhone = mobliePhone;
}
@Test //自动装配 public void test06(){ String cfg=”applicationContext.xml”; ApplicationContext ac=new ClassPathXmlApplicationContext(cfg); Student student = ac.getBean(“student”,Student.class); System.out.println(student.getComputer()); System.out.println(student.getMobliePhone());
}
<a name="y225wy"></a>
## 自动扫描的注解标记:
组建扫描:指定一个包路径,Spring会自动扫描该包以及子包所有的组件类,当发现组件类定义前有特定的注解标记时,就将该组件纳入到Spring容器中。等价于原有的xml配置中的<bean>定义功能。组件扫描能够替代大量的xml配置的<bean>定义
指定扫描路径:使用组件扫描,首先需要在xml配置中指定扫描父级包路径
<context:component-scan base-package="com.zhiyou100"/>
<!--开启mvc注解扫描 -->
<mvc:annotation-driven/>
<!--定义试图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 读取配置文件 -->
<util:properties id="jdbc" location="classpath:jdbc.properties"/>
<!-- 定义数据源 -->
<bean id="ds" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
<property name="url" value="#{jdbc.url}"/>
<property name="driverClassName" value="#{jdbc.driverClass}"/>
<property name="username" value="#{jdbc.user}"/>
<property name="password" value="#{jdbc.password}"/>
</bean>
```
指定扫描类路径后,并不是该路径下所有组件类都扫描到Spring容器的,只有在组件类定义前面有以下注解标记时,才会扫描到Spring容器里。

指定注入依赖关系:
具有依赖关系的bean对象,利用下面注解实现关系注入:
@Autowired/@Qualifier
可以处理构造器注入和setter注入
@Inject/@Named
和@Autowired用法一致,需要额外导包。
@Resource(重点)
只能处理setter注入,但大部分都是setter注入
Setter注入推荐使用@Resource
构造器注入推荐使用@Autowired
@Autowired写在构造器前面,声明为其注入Bean
@Qualifier写在参数前面,声明需要注入的bean的ID
@Component
public class cv{
private CM cM
;
@Autowired
public pram (@Qualifier(“cM”) CM cM) {
this.cM = cM;
}
}
注入的对象是单例时,@Qualifier可省略,此时Spring按照类型匹配参数
@Autowired写在set方法前面,声明要为其注入bean。
@Qualifier写在参数前面,声明需要注入的bean的ID值
@Component
public class CM{
private DM dM
@Autowired
public void setDM( @Qualifier(“dM”) DM dM){
this dM = dM;
}
}
Autowired也可以写在属性上,作用和set方法上类似
@Resource能用于set注入,且更为简单
@Component
public class VM{
private BM bM;
@Resource(name = “bM”)
public void setBM(BM bM){
this bM = bM;
}
}
注入单例对象时,(name=“bM”)可以省略。此时Spring按照类型匹配参数。
@value注解可以注入Spring表达式
首先在xml配置中指定要注入的properties文件
然后在属性或Setter方法前使用@value注解
@Component
public class hit{
@value{“#{cost.pagesize}”}
private int pageSize;
}
