Spring概述

Spring概述

一、Spring是一个基于IOC和AOP来构架多层JavaEE系统的、企业级的、轻量级的、低倾入的框架(后期项目维护,修改代码量较少)

1.方便解耦,简化开发
Spring就是一个大工厂,生产管理实体bean,不用实例化对象,所有的都是通过Spring容器来进行管理

2.AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能

3.声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程

4.方便程序的测试
Spring对Junit支持,可以通过注解方便的测试Spring程序

5.与其它框架的集合度比较好(ssh,ssm)

6.降低了JavaEE API的使用难度
Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低

二、Spring各个模块的介绍
Spring概述_第1张图片
bean(主要就是管理,产生对象)core(主要提供一些核心基础服务)context(提供API开发)

搭建Spring框架的步骤:
1.导入核心的jar包
Spring概述_第2张图片
2.导入核心配置文件(xml文件)
3.进行测试

三、控制反转(IOC)

1.概念:就是不需要自己来实例化这个对象,而依赖于我们的容器也就是Spring框架,控制权的转移就是所谓的反转,目的是为了获得更好的扩展性和良好的可维护性。

2.代码:
存在一个boy对象

public class Boy implements Serializable {
    //说的方法
    public void say(){
        System.out.println("正在聊天!");
    }
}

在Spring容器中定义(配置xml文件)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p ="http://www.springframework.org/schema/p"
       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-3.2.xsd">
<!--id是这个bean唯一标识符-->
   <bean id="boy" class="com.offcn.entity.Boy"></bean>
     </beans>

测试

public class Test {
    public static void main(String[] args) {
 //      Boy boy = new Boy();
 //      boy.say();
         
         /**
         * 如何加载这个配置文件?
         * 1.用全路径
         * ApplicationContext app = new FileSystemXmlApplicationContext("D:\\IdeaProjects\\day01\\src\\appliactionContext.xml");
         * 
         * 2.BeanFactory加载配置文件,参数同样是全路径
         * BeanFactory app = new XmlBeanFactory(new FileSystemResource("D:\\IdeaProjects\\day01\\src\\appliactionContext.xml")); 
         * 
         * 3.类路径
         * ApplicationContext app = new ClassPathXmlApplicationContext("appliactionContext.xml");
         * 第三种方式是用的做多的一种
         * /
         ApplicationContext app = new ClassPathXmlApplicationContext("appliactionContext.xml");
         Boy boy = (Boy)app.getBean("boy");
         boy.say();
    }
}

四、依赖注入

1.概念:在运行期间,由外部容器动态地将依赖对象注入到另一个对象的组件中
2.代码:①两个实体类
Boy.java

public class Boy implements Serializable {
    //说的方法
    public void say(){
        System.out.println("正在接吻!");
    }
}

Girl.java

public class Girl {
    private Boy boy;
    //这里要调用男孩的方法
    public void kiss(){
        boy.say();
    }
    public void setBoy(Boy boy) {
        this.boy = boy;
    }
}

②在Spring容器中定义(配置xml文件)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p ="http://www.springframework.org/schema/p"
       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-3.2.xsd">
   <bean id="boy" class="com.offcn.entity.Boy"></bean>
    <bean id="girl" class="com.offcn.entity.Girl">
    <!--name:在Girl对象中的set方法的属性名称
        ref:将容器创建的对象注入到set方法中,即id名-->
        <property name="boy" ref="boy"></property>
    </bean>
    </beans>

③测试

public class Test {
    public static void main(String[] args) {
         ApplicationContext app = new ClassPathXmlApplicationContext("appliactionContext.xml");
         Girl girl = (Girl)app.getBean("girl");
         girl.kiss();
    }
}

五、实例化bean的方式

1.使用接口和实现类,直接在Spring容器中创建一个类,使用接口进行操作
接口:

public interface UserService {
    public void add();
}

实现类:

public class UserServiceImpl implements UserService {

    @Override
    public void add() {
        System.out.println("增加成功!");
    }
}

配置:

    <!--不能配置接口-->
    <bean id="user" class="com.offcn.service.impl.UserServiceImpl"></bean>

测试:

public class Text {
    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("appliactionContext.xml");
        UserService user = (UserService) app.getBean("user");
        user.add();
    }
}

2.使用静态工厂方法实例化(简单工厂模式)

     // 用静态工厂的方式来产生这个对象                  
      public static UserService createUserService(){
               return new UserServiceImpl();
        }
     
用静态模式来实例化对象
    <bean id="userObject" class="com.offcn.utils.UserObject" factory-method="createUserService"></bean>
          UserService user2 = (UserService)app.getBean("userObject");
          user2.add();

3.使用非静态方法实例化

//    使用非静态的来实例这个对象
      public UserService createUserService(){
              return new UserServiceImpl();
          }
//    使用非静态的方式来实例这个对象
    <bean id="userObject" class="com.offcn.utils.UserObject"></bean>
    <bean id="users" factory-bean="userObject" factory-method="createUserService"></bean>
          UserService user3 = (UserService)app.getBean("users");
          user3.add();

六、注入方式
1.依赖注入手动装配(set方法和构造方法)
①以p命名方式来赋值

public class Person {
    private int pid;
    private  String pname;

    public int getPid() {
        return pid;
    }

    public void setPid(int pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }
}
<!-- 以P命名的方式来赋值-->
<bean id="person" class="com.offcn.entity.Person" p:pid="123" p:pname="wha"></bean>

②用构造方法赋值

public class Student implements Serializable {
    private int sid;
    private String sname;
    private String spwd;

    public Student(int sid, String sname) {
        this.sid = sid;
        this.sname = sname;
    }

    public Student(String sname, String spwd) {
        this.sname = sname;
        this.spwd = spwd;
    }

    public Student(int sid, String sname, String spwd) {
        this.sid = sid;
        this.sname = sname;
        this.spwd = spwd;
    }

    public void print(){
        System.out.println(sid+"\t"+sname+"\t"+spwd);
    }
}

 <bean id="student" class="com.offcn.entity.Student">
        <!--用构造的方法进行值的注入,第一个方式是通过索引,这个索引是从0开始
        <constructor-arg index="0" value="111"></constructor-arg>
        <constructor-arg index="1" value="222"></constructor-arg>
        -->
        <constructor-arg name="sid" value="111"></constructor-arg>
        <constructor-arg name="sname" value="222"></constructor-arg>
    </bean>

③用Spring基本属性赋值

public class UserObject {
    //赋值
    private int sid;
    private String sname;
    private Person person;
    private List list;
    private Set set;
    private Map<String, String> map;
    private Object [] objects;

    public void setObjects(Object[] objects) {
        this.objects = objects;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setSet(Set set) {
        this.set = set;
    }

    public void setList(List list) {
        this.list = list;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public void print() {
        System.out.println(sid + "\t" + sname + "\t" + person.getPid() + "\t" + person.getPname());
        if (list != null && list.size() > 0) {
            for (Object o : list) {
                System.out.println(o);
            }
        }

        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next);
        }
        Set<String> key = map.keySet();
        Iterator<String> it = key.iterator();
        while (it.hasNext()) {
            String n = it.next();
            System.out.println(n + "\t" + map.get(n));
        }
        if(objects!=null&&objects.length>0){
            for (int i=0;i<objects.length;i++){
                System.out.println(objects[i]);
            }
        }
    }
}
 <!-- 用Spring给基本属性赋值-->
    <bean id="userObject" class="com.offcn.utils.UserObject">
        <property name="sid" value="11"></property>
        <property name="sname" value="wanghaoan"></property>
        <property name="person" ref="person"></property>
        <!--配置list集合-->
        <property name="list">
            <list>
                <value>qqq</value>
                <value>www</value>
                <value>hhh</value>
                <value>aaa</value>
            </list>
        </property>
        <!--配置set集合-->
        <property name="set">
            <set>
                <value>nnn</value>
                <value>rrr</value>
                <value>kkk</value>
            </set>
        </property>
        <!--配置map集合-->
        <property name="map">
            <map>
                <entry key="01">
                    <value>编号01</value>
                </entry>
                <entry key="02">
                    <value>编号02</value>
                </entry>
                <entry key="03">
                    <value>编号03</value>
                </entry>
            </map>
        </property>
        <!--配置数组-->
        <property name="objects">
            <array>
                <value>zzz</value>
                <value>ggg</value>
                <value>ppp</value>
            </array>
        </property>
    </bean>

2.注解注入(JDK1.6以上)
Dao层:@Repository用于标注数据访问组件,即Dao层

public interface UserDao {
    //增加方法
    public void add();
}
//dao层的注解是固定的 记住就好
@Repository("userDao")
public class UserDaoImpl implements UserDao {
    @Override
    public void add() {
        System.out.println("增加成功了!");
    }
}

Service层:@Service用于标注业务层 \ @Autowired自动按类型装配@Qualifier(“userDao”)可标注在方法参数里(连用) || @Resource自动按名称装配

public interface UserService {
    public void add();
}
@Service("userService")
public class UserServiceImpl implements UserService {
    //代表自动装配
    //@Autowired
    //@Qualifier("userDao")
    //用的是java的注解来进行装配,jdk的版本必须在1.6以上
    @Resource
    private UserDao userDao;

    /*
    public void setUserDao(@Qualifier("userDao") UserDao userDao) {
        this.userDao = userDao;
    }
    */

    @Override
    public void add() {
        userDao.add();
    }
}

配置文件xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-3.2.xsd">
	<!-- 扫描包中注解标注的类 -->
	<context:component-scan base-package="com.offcn.service,com.offcn.dao" />
</beans>

测试:

public class Test {
    //获取配置文件
    public static void main(String[] args) {

        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserService user = (UserService)app.getBean("userService");
        user.add();
    }
}

你可能感兴趣的:(JAVA框架)