Spring 温习笔记(二)Spring与注解

数据源

考虑现实世界中的mobike 和ofo,他们就可以形象的比喻成为两种不同的"自行车源",数据源实现的基本思想亦复如前,如c3p0,druid是当先最为流行的数据源。

spring与数据源

当在项目中使用数据源时,需要将控制数据源的权限交给spring,可通过spring来全面管理数据源。
在解耦设计思想的指导下,我们将Spring与数据源的配置文件和数据源自身的配置文件加以区分,小案例如下所示。
数据源配置文件:

c3p0.driverDriver=com.mysql.jdbc.Driver
c3p0.url=jdbc:mysql://192.168.168.128:7006/travel
c3p0.user=root
c3p0.password=root
c3p0.initialSize=5
c3p0.maxActive=10
c3p0.maxWait=3000

Spring 配置文件
为了引入外部配置文件,需要在spring配置文件中引入context命名空间:
在这里插入图片描述
修改spring配置文件选择项

<bean id="dataSourceC3p0" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${c3p0.driverDriver}"></property>
        <property name="jdbcUrl" value="${c3p0.url}"></property>
        <property name="user" value="${c3p0.user}"></property>
        <property name="password" value="${c3p0.password}"></property>
</bean>

根据模块化的设计思想,在总的配置文件中引入数据源配置文件

<import resource="classpath:applicationContext_dataSource.xml"></import>

其测试例子如下所示:

        ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        ComboPooledDataSource dataSourceC3p0=(ComboPooledDataSource) appContext.getBean("dataSourceC3p0");
        System.out.println("XXXXXXXXX"+dataSourceC3p0);
        dataSourceC3p0.close();

成功获取到数据源
在这里插入图片描述

注解

然而很多时候单靠这些配置文件就使得整个项目的开发复杂度提升,在这情况下如何进行简化开发就成为各位猿首门迫切想要解决的问题,注解是大猿们在快速开发项目中必不可少的神器,注解的出现使得我们的开发再也不必面对反反复复的spring配置文件,给各位猿带来福音。下面就来温习一下spring注解开发。
spring的注解分为原始注解和新注解。

原始注解

注解 说明
@Component 使用在类上用于实例化Bean
@Controller 使用在web层类上用于实例化Bean
@Service 使用在service层类上用于实例化Bean
@Repository 使用在dao层类上用于实例化Bean
@Autowired 使用在字段上用于根据类型依赖注入
@Qualifier 结合@Autowired一起使用用于根据名称进行依赖注入
@Resource 相当于@Autowired+@Qualifier,按照名称进行注入
@Value 注入普通属性
@Scope 标注Bean的作用范围
@PostConstruct 使用在方法上标注该方法是Bean的初始化方法
@PreDestroy 使用在方法上标注该方法是Bean的销毁方法

notes: 使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。

<!--注解的组件扫描-->
<context:component-scan base-package="com.itheima"></context:component-scan>

@Component, @Repository, @Service,@Controller的区别

**@Component是通用注解,其他三个注解是这个注解的拓展,**并且具有了特定的功能

  1. @Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
  2. @Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
  3. @Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。

@Autowired 与@Resource的区别

  1. @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
  2. @Autowired默认按类型装配(这个注解是属spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
@Autowired
@Qualifier("userDao")
//@Resource(name="userDao")
private UserDao userDao;

在这种情况下我们就可以理解为@Autowired+@Qualifier=@Resource。

  1. @Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。例如:
@Resource(name="userDao")
private UserDao userDao;

@value

@Value(“#{}”) 表示SpEl表达式通常用来获取bean的属性,或者调用bean的某个方法。当然还有可以表示常量
@Value(“${xxxx}”)注解从配置文件读取值的用法
notes:如果采用了注解方法,那么可以省略setter和getter方法,如果使用的是xml配置方式,则需要写Setter和Getter方法。

新注解

使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:

注解 说明
@Configuration 用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解
@ComponentScan 用于指定 Spring 在初始化容器时要扫描的包。 作用和在 Spring 的 xml 配置文件中的 <context:component-scan base-package=“com.itheima”/>一样
@Bean 使用在方法上,标注将该方法的返回值存储到 Spring 容器中
@PropertySource 用于加载.properties 文件中的配置
@Import 用于导入其他配置类

注解配置小案例

将所有的xml获取数据源的配置用注解代替
pom依赖坐标

    <dependencies>

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

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!--<scope>compile</scope>-->
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.26</version>
            <scope>compile</scope>
        </dependency>
        <!--druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.9</version>
        </dependency>


        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>


    </dependencies>

service 层

public interface UserService {
    
    
    public void save();
}
@Service("userService")
public class UserServiceImpl implements UserService {
    
    
    private String username;
    private int age;
    private List<String> course;
    private Map<String, User> userMap;
    @Resource(name = "userDao")
    private UserDao userDao;
    private Properties properties;
    ...
    public void save() {
    
    
        System.out.println("my name is:"+username);
        System.out.println("my age is"+age);
        System.out.println("my course lists is :"+course);
        System.out.println("my favourite teachers is :"+userMap);
        System.out.println("my hobby is "+properties);
        userDao.save();
    }
}

dao层

public interface UserDao {
    
    
    public boolean save();
}
@Repository("userDao")
public class UserDaoImpl implements UserDao {
    
    
    @PostConstruct
    public void initMethod(){
    
    
        System.out.println("初始化方法执行了......");
    }
    @PreDestroy
    public void destroyMethod(){
    
    
        System.out.println("销毁方法执行了.......");
    }
    public boolean save() {
    
    
        System.out.println("调用了save方法。。。。。");
        return false;
    }
}

数据源配置

//<context:property-placeholder location="classpath:c3p0.properties"/>
@PropertySource("classpath:c3p0.properties")
public class DataSourceConfiguration {
    
    
    @Value("${c3p0.driverDriver}")
    private String driver;
    @Value("${c3p0.url}")
    private String url;
    @Value("${c3p0.user}")
    private String user;
    @Value("${c3p0.password}")
    private String password;

    @Bean("dataSource")
    public DataSource getDataSource() throws PropertyVetoException {
    
    
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(user);
        dataSource.setPassword(password);
        return dataSource;
    }
}

spring 注解文件配置

@Configuration
//<context:component-scan base-package="com.feitian"/>
@ComponentScan("com.feitian")
//<import resource="applicationContext_*.xml"/>在中括号中可以加入多个class
@Import({
    
    DataSourceConfiguration.class})
public class SpringConfiguration {
    
    

}

注解测试

public class Anno {
    
    
    @Test
    public void  test01(){
    
    
        ApplicationContext applicationContext= new AnnotationConfigApplicationContext(SpringConfiguration.class);
        UserService userService = (UserService) applicationContext.getBean("userService");
        userService.save();
    }
}

spring 集成junit

spring 集成注解配置文件

@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration("classpath:applicationContext.xml")
@ContextConfiguration(classes = {
    
    SpringConfiguration.class})
public class SpringJunitTest {
    
    
    @Autowired
    private UserService userService;
    @Test
    public void test01(){
    
    
        userService.save();
    }
}

当spring 需要集成xml配置文件时,将ContextConfiguration替换即可

@ContextConfiguration("classpath:applicationContext.xml")

猜你喜欢

转载自blog.csdn.net/xueshanfeitian/article/details/112943068