三、Spring注解开发

1.入门

  • 新建web项目,导入spring相关jar包,并添加核心配置文件applicationContext.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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        <!--配置组件扫描-->
        <context:component-scan base-package="com.itlike.demo1"/>    
</beans>  

2.第一个Demo

  • User
@Component("user")  //相当于bean id=""
public class User {
    public String name;
}
  • applicationContext.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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        <!--配置组件扫描-->
        <context:component-scan base-package="com.itlike.demo1"/>
</beans>
  • UserTest
public class UserTest {
    @Test
    public void test(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user =(User) app.getBean("user");
        System.out.println(user); //有地址说明已经获取了对象!
    }
}

3.注入属性值

  • User
@Component("user")  //相当于bean id=""
public class User {
    //使用value注解注入属性值
    @Value("Hello Spring!")
    public String name;
}
  • applicationContext.xml不变
  • UserTest
System.out.println(user.name); //Hello Spring!

4.衍生注解

  • 为了更好的进行分层,Spring可以使用其它三个注解,功能类似
  • 目前使用哪一个功能都一样, 后期可能会添加一些属于各自的属性
  • @Controller–>web层
  • @Service–>service层
  • @Repository–>dao层
@Controller("user")
public class User {    
    @Value("Hello Spring!")
    public String name;
}  //甚至可以使用Service、Repository

如图,也可以使用Controller实现相同的作用,目的是更好的进行MVC分层。

5.属性注入

  • @Value

设置普通属性值

  • @Autowired

设置对象类型的属性值,直接使用这种方式,是按照类型完全属性注入;

  1. Dog:
@Component("dog")
public class Dog {
    @Value("wc")
    public String name;
}
  1. User:
@Controller("user")
public class User {
    @Value("Hello Spring!")
    public String name;
    //这是按照类型的完全属性注入
    @Autowired
    public Dog dog;
}
  1. UserTest:
System.out.println(user.dog.name); //wc
  1. 但是,习惯上我们是按照名称完成属性注入的。如下:
@Controller("user")
public class User {
    @Value("Hello Spring!")
    public String name;
    @Resource(name="dog") /*根据名称注入*/
    public Dog dog;
}
  • @Scope 设置单例模式、多例模式
@Controller("user")
@Scope("singleton") /*prototype*/
public class User {
   ...
}

6.生命周期

  • @PostConstruct(初始化方法)
  • @PreDestroy(销毁方法)
  • User:
@Controller("user")
public class User {
    @Value("Hello Spring!")
    public String name;
    @Resource(name="dog") /*根据名称注入*/
    public Dog dog;

    @PostConstruct
    public void init(){
        System.out.println("init ---");
    }
    @PreDestroy
    public  void destroy(){
        System.out.println("destroy ---");
    }
}
  • UserTest:
@Test
public void test(){
    ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
    User user =(User) app.getBean("user");
    System.out.println(user.name); //Hello Spring!
    System.out.println(user.dog.name); //wc
    app.close();
    /* result:
    init ---
    Hello Spring !
    wc
    destroy ---
    */
}

7.效益最大化(少数使用)

  • XML与注解比较
  1. XML可以适用任何场景 ,结构清晰,维护方便
  2. 注解不是自己提供的类使用不了,开发简单方便
  • XML与注解整合开发
  1. XML管理Bean
  2. 注解完成属性注入
  3. 使用过程中, 可以不用扫描,扫描是为了类上的注解
  4. 在没有扫描的情况下, 使用属性注解@Resource @Value @Autowired @Qulifier
  • 步骤如下:
  1. applicationContext.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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        <!--配置组件扫描-->
        <!--<context:component-scan base-package="com.itlike.demo1"/>-->

        <!--在不扫描的情况下,可以使用属性注入的注解-->
        <context:annotation-config/>
        <bean id="person" class="com.itlike.demo1.Person"/>
</beans>
  1. Person:
public class Person {
    @Value("zs")
    public String name;
}
  1. PersonTest:
public class PersonTest {
    @Test
    public void test(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person =(Person) app.getBean("person");
        System.out.println(person.name); //zs
    }
}

猜你喜欢

转载自blog.csdn.net/A15815635741/article/details/84196711