spring: 开源,轻量级框架,管理对象容器,主要有 IOC (控制反转),DI(注入属性)
1. 使用Spring框架的好处是什么?
1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦

2.可以使用容易提供的众多服务,如事务管理,消息服务等

3.容器提供单例模式支持

4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能

5.容器提供了众多的辅助类,能加快应用的开发

6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等

7.spring属于低侵入式设计,代码的污染极低

8.独立于各种应用服务器

9.spring的DI机制降低了业务对象替换的复杂性

Spring xml配置

1.资源文件配置 classpath

  1. < context:property-placeholder location = "classpath:db.properties" >

2.数据源配置

  1. <bean id = "dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
  2. <property name="driverClassName" value="${jdbc.driver}"> // 注意name
  3. <property name="url" value="${jdbc.url}">
  4. <property name="username" value="${jdbc.username}">
  5. <property name= "password" value="${jdbc.password}">
  6. </bean>

3.spring-template

  1. <bean id="template" class="">
  2. <property name="dataSource" ref="dataScource">
  3. </bean>

4.事务管理配置、

  1. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

5.事务通知

  1. < tx:advice id="Active" transaction-manager="txManager">
  2. < tx:attriubutes>
  3. <tx:method name="trans"/>
  4. </tx:attriubutes>
  5. </tx:advice>

6切面

  1. <aop:config>
  2. <aop:pointcut expression="execution(* com.zhiyou.pojo.*Dao.*(..)" id="pointcut">
  3. <aop:advisor advice-ref="Actice" pointcut-ref="pointcut">
  4. </aop:config>

7.bean管理

  1. <bean id="UserDao" class ="com.zhiyou100.UserDaoImpl"/>

ApplictionContext与Beanfactory 区别:

Beanfactory:读取bean配置文档,管理实例化加载bean,维护bean之间依赖关系
Applicationcontext:继承了Beanfactory ,具有Beanfactory功能,同时提供了以下功能
1.国际化
2.支持AOP
3.统一资源加载
4.消息机制

实例
HelloWorld.java 文件

  1. public class HelloWorld {
  2. private String message;
  3. public void setMessage(String message){
  4. this.message = message;
  5. }
  6. public void getMessage(){
  7. System.out.println("Your Message : " + message);
  8. }
  9. }

下面是第二个文件 MainApp.java 的内容:

  1. import org.springframework.context.ApplicationContext;
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;
  3. public class MainApp {
  4. public static void main(String[] args) {
  5. ApplicationContext context =
  6. new ClassPathXmlApplicationContext("Beans.xml");
  7. HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
  8. obj.getMessage();
  9. }
  10. }
  • 第一步是我们使用框架 API ClassPathXmlApplicationContext() 来创建应用程序的上下文。这个 API 加载 beans 的配置文件并最终基于所提供的 API,它处理创建并初始化所有的对象,即在配置文件中提到的 beans。

  • 第二步是使用已创建的上下文的 getBean() 方法来获得所需的 bean。这个方法使用 bean 的 ID 返回一个最终可以转换为实际对象的通用对象。一旦有了对象,你就可以使用这个对象调用任何类的方法。

bean作用域

  1. <bean id="hello" name="hahaha" class="com.zhiyou100.spring.ioc.HelloWord" scope="prototype">

singleton:默认值 ,单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例

prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例

request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效

session:,表示每个会话需要容器创建一个全新 Bean。比如对于每个用户一般会有一个会话,该用户的用户信息需要存储到会话中,此时可以将该 Bean 配置为 web 作用域。

globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效

注解

@Runwith(SpringJUnit4ClassRunner.class) 将处理交给Spring管理
@Contextconfigruation 用来指定加载的Spring配置文件的位置,会加载默认配置文件
@AutoWired 属性注入
@Resource java自带属性注入

注入

属性注入
1. 构造器注入

  1. <constructor-arg name=" name " value="张三">

2.setter注入

  1. <bean id = "user" class="com.zhiyou100.demo1.User">
  2. <property name ="name" value="zhangsan"/>
  3. <property name="age" value="18"/>
  4. <property name="type" ref="type"/>
  5. </bean>


p名称空间注入

  1. <bean id= "user1" class="com.zhiyou100.demo1.User" p:age="19" p:name="李四" p:type-ref="type"/>
  1. 接口注入

复杂注入

  1. <property name ="set">
  2. <set>
  3. < value="1">
  4. </set>
  5. </property>

引用型注入 ref bean

  1. <bean id = "user" class="com.zhiyou100.demo1.User">
  2. <property name ="name" value="zhangsan"/>
  3. <property name="age" value="18"/>
  4. <property name="type" ref="type"/>
  5. </bean>
  6. <bean id="type" class="com.zhiyou100.demo1.WorkType">
  7. <property name="name" value="学生"/>
  8. </bean>

Bean实例化

1.构造器实例化
2. 静态工厂实例化、
3. 实例工厂实例化
实例工厂方式, 就是里面的getBean 方法不是静态的,也就是代表要先实例1个工厂对象, 才能依靠这个工厂对象去获得bean 对象。

数据库应用

XML 数据库配置

  1. //加载资源
  2. <context:property-placeholder location="classpath:db.properties"/>
  3. <!-- 配置数据源对象 -->
  4. <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
  5. <property name="username" value="${jdbc.username}"/>
  6. <property name="password" value="${jdbc.password}"/>
  7. <property name="url" value="${jdbc.url}"/>
  8. <property name="driverClassName" value="${jdbc.driver}"/>
  9. </bean>
  10. <bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">
  11. <property name="dataSource" ref="dataSource"> </property>

UserDao.java
方法的接口

  1. public interface UserDao {
  2. void add(String name, String password,String phone);
  3. void delete(int id);
  4. void update(int id,String name, String password,String phone);
  5. UserBean query(int id);
  6. List<UserBean> list();
  7. }

UserDaoimpl.java
实现UserDao方法操作

  1. public class UserDaoImpl implements UserDao {
  2. @Autowired
  3. private DataSource dataSoure;
  4. //得到数据库的操作实例
  5. @Autowired
  6. JdbcTemplate templete ;
  7. public void add(String name, String password, String phone) {
  8. templete.execute("insert into user (name,password,phone)values('"+name+"','"+password+"','"+phone+"')");
  9. }
  10. @Override
  11. public void delete(int id) {
  12. templete.execute("delete from user where id= "+id);
  13. }
  14. @Override
  15. public void update(int id, String name, String password, String phone) {
  16. String sql ="update user set name =? ,password=? ,phone=? where id = ?";
  17. templete.update(sql ,name,password,phone,id);
  18. }
  19. @Override
  20. public UserBean query(int id) {
  21. String sql = "select * from user where id="+id;
  22. return templete.query(sql, new ResultSetExtractor<UserBean>() {
  23. @Override
  24. public UserBean extractData(ResultSet rs) throws SQLException, DataAccessException {
  25. if(rs.next()) {
  26. UserBean user = new UserBean();
  27. user.setId(rs.getInt(1));
  28. user.setName(rs.getString(2));
  29. user.setPassword(rs.getString(3));
  30. user.setPhone(rs.getString(4));
  31. return user;
  32. }
  33. return null;
  34. }
  35. });
  36. }
  37. @Override
  38. public List<UserBean> list() {
  39. String sql ="select * from user " ;
  40. return templete.query(sql , new RowMapper<UserBean>() {
  41. @Override
  42. public UserBean mapRow(ResultSet rs, int rows) throws SQLException {
  43. System.out.println(rows);
  44. UserBean user = new UserBean();
  45. user.setId(rs.getInt(1));
  46. user.setName(rs.getString(2));
  47. user.setPassword(rs.getString(3));
  48. user.setPhone(rs.getString(4));
  49. return user;
  50. }
  51. });
  52. }
  53. }

获取Bean

  1. public class BeanUtil {
  2. private static ApplicationContext appc = new ClassPathXmlApplicationContext("applicationContext.xml");
  3. public static Object getBean(String name) {
  4. return appc.getBean(name);
  5. }
  6. }

对象User
TestSpring

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration
  3. public class TestSprin {
  4. @Autowired
  5. private ApplicationContext appc;
  6. @Autowired
  7. private UserBean user1;
  8. @Resource
  9. private UserDao userDao1;
  10. @Test
  11. public void getUser() {
  12. System.out.println(user1);
  13. }
  14. @Test
  15. public void excuteAdd() {
  16. userDao1.add("张三", "12345", "1234445");
  17. //userDao.delete(1);
  18. //System.out.println(userDao.query(2));
  19. //System.out.println(userDao.list());
  20. userDao1.update(2, "陈涛1234", "112","112345");
  21. }
  22. }