Loading

Spring全解-02-第一个Spring程序

HelloSpring

导入jar包,spring-webmvc,他会自动下载所需要的的依赖项

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>5.1.10.RELEASE</version>
</dependency>

创建实体类

public class Hello {
   private String name;

   public String getName() {
       return name;
  }
   public void setName(String name) {
       this.name = name;
  }

   public void show(){
       System.out.println("Hello,"+ name );
  }
}

编写spring的配置文件,beans.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"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

   <!--bean就是java对象 , 由Spring创建和管理-->
   <bean id="hello" class="com.kuang.pojo.Hello">
       <property name="name" value="Spring"/>
   </bean>

</beans>

测试

@Test
public void test(){
   //解析beans.xml文件 , 生成管理相应的Bean对象
   ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
   //getBean : 参数即为spring配置文件中bean的id .
   Hello hello = (Hello) context.getBean("hello");
   hello.show();
}

由结论逆推思考

Hello对象是谁创建的?Hello对象的属性是怎么设置的?

Hello对象是由Spring创建的,Hello对象的属性是由Spring容器设置的。

这整个过程就是控制反转

控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的。

反转:程序本身不创建对象,而变成被动的接收对象。

依赖注入:就是利用set方法来进行注入的。

IOC是一种编程思想,由主动的编程变成被动的接收。

可以通过newClassPathXmlApplicationContext查看底层源码。

 

利用控制反转思想,改编案例

<?xml version="1.0" encoding="UTF-8"?>
<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 id="MysqlImpl" class="com.li.dao.impl.UserDaoMySqlImpl"/>
   <bean id="OracleImpl" class="com.li.dao.impl.UserDaoOracleImpl"/>

   <bean id="ServiceImpl" class="com.li.service.impl.UserServiceImpl">
       <!--注意: 这里的name并不是属性 , 而是set方法后面的那部分 , 首字母小写-->
       <!--引用另外一个bean , 不是用value 而是用 ref-->
       <property name="userDao" ref="OracleImpl"/>
   </bean>

</beans>
@Test
public void test2(){
   ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
   UserServiceImpl serviceImpl = (UserServiceImpl) context.getBean("ServiceImpl");
   serviceImpl.getUser();
}

现在,如果再添加新的接口实现类,也不用去程序中改动了,只需要在xml配置文件中新增就好了,所谓的ioc,一句话概括就是:对象由Spring来创建、管理、装配。

 

IOC创建对象的方式

有两种,通过无参构造方法来创建,通过有参构造方法来创建

1.通过无参构造方法创建对象

public class User {

   private String name;

   public User() {
       System.out.println("user无参构造方法");
  }

   public void setName(String name) {
       this.name = name;
  }

   public void show(){
       System.out.println("name="+ name );
  }

}
<?xml version="1.0" encoding="UTF-8"?>
<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 id="user" class="com.li.pojo.User">
       <property name="name" value="fuyao"/>
   </bean>

</beans>
@Test
public void test(){
   ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
   //在执行getBean的时候, user已经创建好了 , 通过无参构造
   User user = (User) context.getBean("user");
   //调用对象的方法 .
   user.show();
}

通过日志输出,可以看出,程序在调用show方法之前,user对象已经通过无参构造初始化了。

2.通过有参构造方法创建对象

public class UserT {

   private String name;

   public UserT(String name) {
       this.name = name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public void show(){
       System.out.println("name="+ name );
  }

}

有参构造有三种编写方式,推荐使用第二种

<!-- 第一种根据index参数下标设置 -->
<bean id="userT" class="com.li.pojo.UserT">
   <!-- index指构造方法 , 下标从0开始 -->
   <constructor-arg index="0" value="fuyao"/>
</bean>
<!-- 第二种根据参数名字设置 -->
<bean id="userT" class="com.li.pojo.UserT">
   <!-- name指参数名 -->
   <constructor-arg name="name" value="fuyao"/>
</bean>
<!-- 第三种根据参数类型设置 -->
<bean id="userT" class="com.li.pojo.UserT">
   <constructor-arg type="java.lang.String" value="fuyao"/>
</bean>
@Test
public void testT(){
   ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
   UserT user = (UserT) context.getBean("userT");
   user.show();
}

 

结论:不管是通过无参构造方法还是有参构造方法来创建对象,在配置文件加载的时候,其中管理的对象都已经初始化了。

 

Spring配置

别名配置

可以设置多个别名

<!--设置别名:在获取Bean的时候可以使用别名获取-->
<alias name="userT" alias="userNew"/>
<!--bean就是java对象,由Spring创建和管理-->

<!--
   id 是bean的标识符,要唯一,如果没有配置id,name就是默认标识符
   如果配置id,又配置了name,那么name是别名
   name可以设置多个别名,可以用逗号,分号,空格隔开
   如果不配置id和name,可以根据applicationContext.getBean(.class)获取对象;

class是bean的全限定名=包名+类名
-->
<bean id="hello" name="hello2 h2,h3;h4" class="com.li.pojo.Hello">
   <property name="name" value="Spring"/>
</bean>

import的使用

团队分工合作,可以自己编写自己的配置文件,最后通过import来实现合流。

 <import resource="{path}/beans.xml"/>

posted @ 2021-06-23 16:43  你比从前快乐;  阅读(62)  评论(0编辑  收藏  举报